我可能错过了文档中的某些内容,但我在打字稿中找不到任何方法来获取函数中参数的类型。也就是说,我有一个功能
function test(a: string, b: number) { console.log(a); console.log(b) }
我想访问类型string和number,可能是一个元组。
string
number
我知道我可以获取函数本身的类型 astypeof test或通过ReturnType<test>.
typeof test
ReturnType<test>
当我尝试keyof typeof test时,它返回了never,我也无法解释。
keyof typeof test
never
像这样的其他答案指向extends,但我真的不明白它是如何工作的,也没有给我一种简单的方法来访问所有参数集作为一种类型。
extends
Typescript 现在在标准库中带有一个预定义Parameters<F>的类型别名,与下面几乎相同ArgumentTypes<>,因此您可以直接使用它而不是创建自己的类型别名。
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]
看起来不错。请注意,这些增强的元组还捕获诸如可选参数和剩余参数之类的内容:
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[]]
希望有帮助。祝你好运!