给出一个既包含呼叫签名又包含其他属性的类型,例如:
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;
答案 0 :(得分:1)
您可以使用ReturnType
和Parameters
内置类型来提取参数并返回类型并重建签名:
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;