小编典典

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

all

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

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

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

我知道我可以获取函数本身的类型 astypeof test或通过ReturnType<test>.

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

像这样的其他答案指向extends,但我真的不明白它是如何工作的,也没有给我一种简单的方法来访问所有参数集作为一种类型。


阅读 80

收藏
2022-07-30

共1个答案

小编典典

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]

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

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[]]

希望有帮助。祝你好运!

2022-07-30