在Typescript中是否有类似ReturnType <T>的ArgumentsType <T>?

Joo*_*oon 10 typescript

ReturnType<T> 提取函数的返回类型.

有没有办法定义ArgumentsType<T>tuple格式提取函数的参数类型?

例如,

ArgumentsType<(a: number, b: string) => boolean>会的[number, string].

Tit*_*mir 16

编辑

自编写原始答案以来,typescript现在具有内置类型(定义lib.d.ts)以获取所调用参数的类型Parameters

type argsEmpty = Parameters<() => void> // []
type args = Parameters<(x: number, y: string, z: boolean) => void> // [number, string, boolean]
type argsOpt = Parameters<(x: number, y?: string, z?: boolean) => void> // [number, (string | undefined)?, (boolean | undefined)?]
Run Code Online (Sandbox Code Playgroud)

编辑 Typescript 3.0已经被解释下面的代码按预期工作.

虽然这在当前版本的typescript(2.9)中是不可能的,但没有拼写出所有参数.在将于未来几天发布的下一版本的typescript(3.0)中,它将成为可能:

type ArgumentsType<T> = T extends  (...args: infer U) => any ? U: never;

type argsEmpty = ArgumentsType<() => void> // []
type args = ArgumentsType<(x: number, y: string, z: boolean) => void> // [number, string, boolean]
type argsOpt = ArgumentsType<(x: number, y?: string, z?: boolean) => void> // [number, (string | undefined)?, (boolean | undefined)?]
Run Code Online (Sandbox Code Playgroud)

如果您安装了,npm install typescript@next您已经可以使用它,它应该在本月某个时候可用.

注意

我们还可以使用这个新功能将元组传播到参数中:

type Spread<T extends any[]> = (...args: T)=> void;
type Func = Spread<args> //(x: number, y: string, z: boolean) => void
Run Code Online (Sandbox Code Playgroud)

您可以在此处详细了解此功能

  • @NahushFarkande 对于您的示例 `b(param:Parameters&lt;myClass['a']&gt; [0])` 或 `b(param:Parameters&lt;this['a']&gt; [0])` (但我会避免多态这通常是。 (2认同)

Kar*_*ski 8

从 TypeScript 3.1 开始,Parameters类型现在是标准库的一部分。

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