我可能错过了文档中的某些内容,但是我在打字稿中找不到任何方法来获取函数中参数的类型。也就是说,我有一个功能
function test(a: string, b: number) {
console.log(a);
console.log(b)
}
我想访问string
和number
类型,可能是一个元组。
我知道我可以得到函数本身的类型,如typeof test
或通过ReturnType<test>
返回类型。
当我尝试keyof typeof test
时,它返回了never
,我也无法解释。
其他答案like this one指向extends
,但我不太了解它的工作原理,也没有给我一种简便的方法来访问所有类型的参数集
答案 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"]