从TypeScript中的接口获取参数类型

时间:2019-10-18 09:57:51

标签: typescript

给出这样的界面:

interface IDelegates {
  delegateOne: (name: string, age: number) => string;
  delegateTwo: (date: Date) => number;
}

如何基于接口属性名称定义一个采用正确委托类型的func的方法?

我可以使用Pick<IDelegates, 'delegateOne'>获得一个只包含我想要的属性的类型,它返回一个类型:

{
  delegateOne: (name: string, age: number) => string;
}

但是我不知道是否有办法做Parameters<Pick<IDelegates, 'delegateOne'>>

我明白为什么这不起作用,但是事情可能有办法吗?基本上,我需要PickOne之类的东西来返回 just 属性'delegateOne',而不是类型包含的属性。

1 个答案:

答案 0 :(得分:1)

您想要lookup types而不是使用Pick<T, K>,实际上更简单。如果您具有对象类型T和可分配给K的密钥类型keyof T,则具有密钥T的{​​{1}}属性的类型为: K 。因此,您可以在类型级别使用熟悉的括号索引访问符号。

(在旁边:请注意,you cannot use dot notation for lookup types即使T[K]是字符串文字类型。例如,您需要编写类型K以获得Array<string>["length"]而不是{ {1}}。点已经在类型级别用于命名空间,因此他们不想引入歧义和可能的名称冲突,因为它们允许相同的符号表示两种不同的类型操作。)

the definition of Pick<T, K>中并非偶然使用查找类型来获取number的键集中的Array<string>.length的每个属性:

T

无论如何,这意味着您应该这样做:

K

好的,希望能有所帮助。祝你好运!

Link to code