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

Sim*_*mon 1 typescript

给定一个这样的接口:

interface IDelegates {
  delegateOne: (name: string, age: number) => string;
  delegateTwo: (date: Date) => number;
}
Run Code Online (Sandbox Code Playgroud)

如何根据接口属性名称定义一个接受正确委托类型的函数的方法?

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

{
  delegateOne: (name: string, age: number) => string;
}
Run Code Online (Sandbox Code Playgroud)

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

我明白为什么这行不通,但是可能有办法吗?基本上我需要什么,PickOne返回属性“delegateOne”,而不是包含该属性的类型。

jca*_*alz 7

Pick<T, K>您不需要使用 ,而是需要查找类型,这实际上更简单。如果您有一个对象类型T和一个K可分配给 的键类型,则with keykeyof T的属性类型为:。因此,您可以使用熟悉的括号索引访问表示法,但在类型级别。TKT[K]

(旁白:请注意,即使是字符串文字类型,也不能对查找类型使用点表示法K。例如,您需要将 type 写入Array<string>["length"]getnumber而不是Array<string>.length。点已在类型级别用于命名空间,因此它们不不想引入歧义和可能的名称冲突,允许相同的符号表示两种不同类型的操作。)

并非巧合的是,在的 定义Pick<T, K>T中使用查找类型来获取中键集中的每个属性K

type Pick<T, K extends keyof T> = {
    [P in K]: T[P]; // T[P] is the type of property of T with key P
};
Run Code Online (Sandbox Code Playgroud)

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

type ThingYouWant = Parameters<IDelegates["delegateOne"]>;
// type ThingYouWant = [string, number]
Run Code Online (Sandbox Code Playgroud)

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

链接到代码