从类型中提取呼叫签名

时间:2019-03-27 11:27:23

标签: typescript

给出一个既包含呼叫签名又包含其他属性的类型,例如:

export interface Foo<T> {
    (arg: T): T;
    doFoo(): void;
}

我们如何键入一个实现这种类型的调用签名的函数?

// Property 'doFoo' is missing in type '(arg: string) => string'
// but required in type 'Foo<string>'.
const foo: Foo<string> = (arg: string) => arg;

排除呼叫签名的一种方法是使用映射类型,因为呼叫签名将不在keyof Foo<T>中:

type FooProperties<T> = { [K in keyof Foo<T>]: Foo<T>[K] };

const foo: FooProperties<string> = {
    doFoo() {}
};

但是我们怎么能得到相反的结果,那就是的呼叫签名,因此我们可以编写以下内容?

type FooSignature<T> = /* …? */

const foo: FooSignature<string> = (arg: string) => arg;

1 个答案:

答案 0 :(得分:1)

您可以使用ReturnTypeParameters内置类型来提取参数并返回类型并重建签名:

export interface Foo<T> {
    (arg: T): T;
    doFoo(): void;
}

type JustSignature<T extends (...a: any[]) => unknown> = (...a: Parameters<T>) => ReturnType<T>

type FooSignature<T> = JustSignature<Foo<T>>

const foo: FooSignature<string> = (arg: string) => arg;