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

272

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

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

我希望能够访问stringnumber类型,最好是作为一个元组。

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

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

其他答案(例如这个)指向了extends,但我并不真正理解它的工作方式,也没有简单的方法来访问所有参数的集合作为一种类型。


我恐怕不太明白:您是想从 a 中获取 string,从 b 中获取 number 吗? - creativecreatorormaybenot
我想通过对函数“test”应用某种操作来获取[string,number]或类似的结果(可能是元组)。 - ABMagil
1个回答

499
现在,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[]]

30
谢谢,@jcalz。看起来这个功能现在在TypeScript本身中可用,称为Parameters - Stephen Niedzielski
1
infer 关键字是什么意思? - transang
1
请参阅条件类型中的类型推断 - jcalz
1
当参数为未知时(...args:any []),是否可以使用函数的参数类型来定义另一个函数的参数类型? - Erfan Azary
5
算了,我找到了。如果有人想知道,你可以这样做:(...args: Parameters<typeof anotherFunction>) => .... - Erfan Azary
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接