TypeScript:通过推断函数的参数类型来定义类型

时间:2019-12-17 08:14:29

标签: typescript typescript-typings typescript-generics

是否有可能描述通过函数的参数推断出的类型?我需要这样的东西:

// some fn I have no control over its params
function someFn(a: string, b?: number, c?: any): any { /* ... */ }

// my wanted type that describes the args as object-records:
const result: MyType<typeof someFn> = {
 a: 'str',
 b: 42,
 c: null
};

我无法控制函数参数的签名,因此不能将其转换为someFn(args: SomeFnArgs)MyType<SomeFnArgs>

我不知道是否有可能描述类型。

1 个答案:

答案 0 :(得分:0)

是的,尽管不是那样。键入函数签名时,参数名称会丢失。您的示例中someFn的参数类型为[string, number?, any](尽管该示例不是很有效,因为非可选参数可能不会出现在可选参数之后。

您可以通过(playground)获得此类型:

// type Parameters<T extends Function> = T extends (...args: infer R) => any ? R : never;
// How it's implemented, Parameters is a built-in type.

function someFn(a: string, b?: number, c?: any): any { /* ... */ }

type T0 = Parameters<typeof someFn>; // type T0 = [string, (number | undefined)?, any?]

const x: T0 = ['hello', 42]; // good
const y: T0 = ['hello', 'world', '!!']; // bad