TypeScript:如何指定箭头函数类型的泛型参数
如何指定泛型参数使用带泛型的箭头函数类型
问题本质
你定义的ArrowFunc和ArrowFunc2里的泛型<T>属于函数自身的泛型参数,也就是说这个类型代表的是“能处理任意类型T的泛型函数”,而不是“绑定了特定T的函数类型”。所以直接ArrowFunc<T>会失效——因为泛型参数不属于类型本身,而是属于类型里的函数。
解决方案
1. 显式调用泛型函数来绑定类型
如果已经有符合ArrowFunc类型的函数,可以直接通过显式指定泛型参数的方式,得到绑定特定类型的函数:
interface ArrowFunc { <T>(arg: T): T; } // 先定义符合类型的泛型函数 const genericFunc: ArrowFunc = (arg) => arg; // 显式指定泛型参数,得到绑定string类型的函数 const stringFunc = genericFunc<string>; // 此时stringFunc的类型是 (arg: string) => string
2. 把泛型参数提升到类型层面(推荐)
重新定义一个泛型类型,让泛型参数属于类型本身,这样就能通过指定类型参数来直接生成绑定特定类型的函数类型:
// 基于interface的改造 interface GenericArrowFunc<T> { (arg: T): T; } // 指定string作为泛型参数,得到处理string的函数类型 type StringFunc = GenericArrowFunc<string>; // 基于type的改造 type GenericArrowFunc2<T> = (arg: T) => T; // 指定number作为泛型参数,得到处理number的函数类型 type NumberFunc = GenericArrowFunc2<number>;
这种方式把泛型的作用域从函数提升到了类型,完全符合你想要的[类型]<T>的使用方式。
3. 直接定义绑定特定类型的函数类型
如果不需要复用原有的ArrowFunc类型,也可以直接写出目标函数类型:
type StringFunc = (arg: string) => string;
总结
核心区别在于:
- 原
ArrowFunc:泛型是函数的参数,代表“任意泛型函数” - 改造后的
GenericArrowFunc<T>:泛型是类型的参数,代表“处理T类型的函数”
根据实际场景选择合适的方式即可。
内容的提问来源于stack exchange,提问作者true_mogician
相关产品推荐
相关产品推荐

