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

ABM*_*gil 32 typescript

我可能在文档中遗漏了一些内容,但是我无法在typescript中找到任何方法来获取函数中的参数类型.也就是说,我有一个功能

function test(a: string, b: number) {
    console.log(a);
    console.log(b)
}
Run Code Online (Sandbox Code Playgroud)

我想要访问类型,stringnumber可能作为元组.

我知道我可以获得函数本身的类型typeof test,或者返回类型via ReturnType<test>.

当我尝试时keyof typeof test,它又回来了never,我也无法解释.

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

jca*_*alz 72

是的,既然TypeScript 3.0 在休息/传播位置引入了元组,您可以创建一个条件类型来执行此操作:

type TestParams = Parameters<(a: string, b: number) => void> // [string, number]
Run Code Online (Sandbox Code Playgroud)

让我们看看它是否有效:

type ArgumentTypes<F extends Function> = F extends (...args: infer A) => any ? A : never;
Run Code Online (Sandbox Code Playgroud)

看起来不错.请注意,这些增强的元组还捕获可选参数和休息参数等内容:

type TestArguments = ArgumentTypes<typeof test>; // [string, number]
Run Code Online (Sandbox Code Playgroud)

更新:事实上,标准库中有一个预定义的Parameters<F>类型别名,几乎与之相同ArgumentTypes<>,因此您可以使用它而不是创建自己的类型别名.

希望有所帮助.祝好运!

  • 谢谢,@ jcalz.看来这个功能现在可以在TypeScript中作为`Parameters`使用. (7认同)
  • 没关系,找到了。对于任何想知道的人,您可以这样做:`(...args:Parameters&lt;typeof anotherFunction&gt;) =&gt; ....` (5认同)