为什么此 Typescript 错误“此表达式不可调用”?

San*_*ndy 0 typescript

我有以下 Typescript 代码,IDE 告诉我“此表达式不可调用。类型 'Pick<IUserContext, "clearAllLoginData">' 没有调用签名。” 但我不明白为什么。

据我理解,函数clearAllLoginData的参数logout应该是类型() => void,因为它是Pick从IUserContext接口中获得的。

任何指示表示赞赏!

interface IUserContext {
    id?: number;
    email?: string;
    fname?: string;
    lname?: string;
    slname?: string;
    companyId?: number;
    companyName?: string;
    clearAllLoginData: () => void;
    setAllLoginData: () => void;
  }


interface LogoutParams {
    clearAllLoginData: Pick<IUserContext, "clearAllLoginData">;
    afterLogout?: () => void;
}

export const logout = ({ clearAllLoginData, afterLogout }: LogoutParams):void => {
    clearAllLoginData(); // <---- Error: "This expression is not callable"
    if (afterLogout) {
      afterLogout();
    }
};
Run Code Online (Sandbox Code Playgroud)

Cer*_*nce 5

什么Pick是

通过从 Type 中选取属性 Keys(字符串文字或字符串文字的并集)集来构造类型。

换句话说 - 它从另一个对象类型创建一个对象类型。

Pick<IUserContext, "clearAllLoginData">
Run Code Online (Sandbox Code Playgroud)

将产生一个类型:

{
  clearAllLoginData: () => void;
}
Run Code Online (Sandbox Code Playgroud)

它不会给你一种类型

() => void
Run Code Online (Sandbox Code Playgroud)

Pick在这里不是正确的工具。你需要这样的东西:

interface LogoutParams {
    clearAllLoginData: IUserContext["clearAllLoginData"]
    afterLogout?: () => void;
}
Run Code Online (Sandbox Code Playgroud)