如何从Typescript中的函数获取参数类型

时间:2018-08-15 01:14:52

标签: typescript

我可能错过了文档中的某些内容,但是我在打字稿中找不到任何方法来获取函数中参数的类型。也就是说,我有一个功能

function test(a: string, b: number) {
    console.log(a);
    console.log(b)
}

我想访问stringnumber类型,可能是一个元组。

我知道我可以得到函数本身的类型,如typeof test或通过ReturnType<test>返回类型。

当我尝试keyof typeof test时,它返回了never,我也无法解释。

其他答案like this one指向extends,但我不太了解它的工作原理,也没有给我一种简便的方法来访问所有类型的参数集

2 个答案:

答案 0 :(得分:39)

Typescript现在带有predefined Parameters<F> type alias in the standard library,它与下面的ArgumentTypes<>几乎相同,因此您可以使用它而不是创建自己的类型别名。

type TestParams = Parameters<(a: string, b: number) => void> // [string, number]

原始答案:


是的,现在TypeScript 3.0引入了tuples in rest/spread positions,您可以创建条件类型来做到这一点:

type ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;

让我们看看它是否有效:

type TestArguments = ArgumentTypes<typeof test>; // [string, number]

看起来不错。请注意,这些增强的元组还捕获诸如可选参数和rest参数之类的东西:

declare function optionalParams(a: string, b?: number, c?: boolean): void;
type OptionalParamsArgs = ArgumentTypes<typeof optionalParams>; 
// [string, (number | undefined)?, (boolean | undefined)?]

declare function restParams(a: string, b: number, ...c: boolean[]): void;
type RestParamsArgs = ArgumentTypes<typeof restParams>;
// [string, number, ...boolean[]]

希望有帮助。祝你好运!

答案 1 :(得分:2)

可能的解决方案是使用arguments变量(这是在所有函数中均可访问的局部变量,并且包含传递给该函数的每个参数的条目)。因此,您可以这样做:

const args = Array.prototype.slice.call(arguments, 0, arguments.length);
const argTypes = args.map(e => typeof e); 
console.log(argTypes);        

此打印:

["string", "number"]