首页 > 解决方案 > 如何正确键入泛型函数的参数?

问题描述

我正在尝试将函数的参数分配给类型别名。例如对于这个功能:

function foo<T>(bar: T, baz: number) {}

我想获得其参数的签名。通常,我会这样做:

type FooParams = Parameters<typeof foo>;

但问题是这会导致签名[{}, number]有意义,因为我没有指定是什么T。但是,那么我希望这会起作用:

type FooParams<T> = Parameters<typeof foo<T>>; // hopefully [T, number]

但事实并非如此,它只会导致一堆语法错误。

是否可以正确获取泛型函数参数列表的类型?

标签: typescriptgeneric-type-parameters

解决方案


您可以使用该infer关键字:

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

type R = Args<(args: number, arg: string) => number >;
// R = [number, string] 

这意味着该类型I被视为泛型,但您不必像这样声明它:let fn = <T>(arg:T): T {...

游乐场文档


您可以实现泛型类型,但必须声明函数类型:

type Foo<T> = (bar: T, baz: number) => void;
type R2<Placeholder> = Args<Foo<Placeholder>>; // [Placeholder, number]
type R3 = R2<boolean> // [boolean, number]

推荐阅读