網站搜尋

TypeScript 從函數介面選取呼叫簽名


有一個帶有靜態屬性的函數介面:

interface MyFunction {
  (value: string): string;
  a: string;
  b: string;
}

我如何只 Pick 呼叫簽名(忽略 a 和 b)?

答案#1

你無法選擇呼叫簽名,因為它不是你介面的屬性。
你可以這樣做:

interface MyFunction {
    (value: string): string;
    a: string;
    b: string;
}

type Callable<T> = T extends (...args: any[]) => any ? (...args: Parameters<T>) => ReturnType<T> : never;

type MyFunctionCallSignature = Callable<MyFunction>;

答案#2

你無法 Pick 它,因為你無法傳遞一個 string 鍵來選擇它,然而這裡有一些構造類型可以推斷你的函數的正確類型:

interface MyFunction {
  (value: string): string;
  a: string;
  b: string;
}

type SignatureType<T> = T extends (...args: infer R) => any ? R : never;
type CallableType<T extends (...args: any[]) => any> = (...args: SignatureType<T>) => ReturnType<T>;

type CallableOfMyFunction = CallableType<MyFunction>; // Type (value: string) => string

遊樂場連結