typescript - 如何正确键入泛型函数的参数?
问题描述
我正在尝试将函数的参数分配给类型别名。例如对于这个功能:
function foo<T>(bar: T, baz: number) {}
我想获得其参数的签名。通常,我会这样做:
type FooParams = Parameters<typeof foo>;
但问题是这会导致签名[{}, number]
有意义,因为我没有指定是什么T
。但是,那么我希望这会起作用:
type FooParams<T> = Parameters<typeof foo<T>>; // hopefully [T, number]
但事实并非如此,它只会导致一堆语法错误。
是否可以正确获取泛型函数参数列表的类型?
解决方案
您可以使用该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]
推荐阅读
- java - Java 嵌套监视器(摆脱明显的死锁)
- autosar - DEM 读取快照数据时如何获取事件 ID?[autosar][矢量]
- reactjs - 没有使用渲染道具定义道具
- python - 如何使用python从.txt文件中提取随机单词?
- python - 如何使用python从字符串中删除引用的单词/短语?
- javascript - OrientDB:如何检查服务器端函数中的查询结果是否为空?
- c# - 在现有 .NET Core MVC 项目中基于 URL 有条件地渲染 React 组件
- javascript - 使用变换缩放:矩阵():如何坚持左边缘(改变缩放中心)?
- java - Java TCP Ping IP 地址
- php - 如何将主键的值插入到插入查询中