我可能在文档中遗漏了一些东西,但我在typescript中找不到任何方法来获得函数中参数的类型。也就是说,我得到了一个函数

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

我想访问类型字符串和数字,可能作为一个元组。

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

当我尝试keyof typeof测试时,它从未返回,这也是我无法解释的。

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


当前回答

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]

看起来不错。注意,这些增强的元组还捕获了可选参数和rest参数:

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

其他回答

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]

看起来不错。注意,这些增强的元组还捕获了可选参数和rest参数:

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