我可能在文档中遗漏了一些东西,但我在typescript中找不到任何方法来获得函数中参数的类型。也就是说,我得到了一个函数
function test(a: string, b: number) {
console.log(a);
console.log(b)
}
我想访问类型字符串和数字,可能作为一个元组。
我知道我可以得到函数本身的类型,如typeof test,或通过ReturnType<test>获得返回类型。
当我尝试keyof typeof测试时,它从未返回,这也是我无法解释的。
其他的答案,比如这一点指向扩展,但我真的不明白这是如何工作的,也没有给我一个简单的方法来访问所有参数集作为类型。
Typescript现在在标准库中带有一个预定义的Parameters<F>类型别名,它几乎与下面的ArgumentTypes<>相同,所以你可以使用它而不是创建自己的类型别名。
type TestParams = Parameters<(a: string, b: number) => void> // [string, number]
然后,例如要获取第二个参数的类型,您可以使用数值索引操作符:
type SecondParam = TestParams[1] // number
最初的回答:
是的,现在TypeScript 3.0已经在rest/spread位置引入了元组,你可以创建一个条件类型来做到这一点:
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[]]