TypeScript中是否支持在泛型内部嵌套使用另一个泛型?
问题解答
结论
当前所有稳定版本的 TypeScript 都支持在泛型内部嵌套使用其他泛型变量,你第一种写法报错属于语法使用错误,不是特性不支持。
错误原因
你尝试将泛型参数 <Result> 直接写在泛型类型 LamdaFn 前方,不符合 TypeScript 类型语法规范:泛型参数必须声明在函数类型定义的位置,或是外层类型的参数列表中,不能直接附加在已定义的泛型类型前。
可行实现方案
如果你想复用 LamdaFn 来定义 map 的类型,可以通过抽离通用泛型函数类型的方式实现,最终效果和你当前可运行的写法完全等价:
type LamdaFn<Value, Result> = (x: Value) => Result; // 抽离通用的带泛型的Map函数类型 type GenericMapFn<InputType, ReturnType> = <Result>(fn: LamdaFn<InputType, Result>) => ReturnType; type None = { // 直接使用预定义的泛型类型,符合你期望的简化写法 map: GenericMapFn<null, None> }
如果你不需要复用这个map的类型,你原有的第二种写法就是官方推荐的标准实现,两种写法的类型检查效果完全一致,没有性能或可维护性差异。
类型验证
以上定义的类型调用时可以正常推导泛型,符合预期逻辑:
const none: None = { map: (fn) => none } // 调用时泛型参数Result会自动推导为 string | undefined const result = none.map(x => x?.toString()) // result 类型会被正确识别为 None
内容的提问来源于stack exchange,提问作者Kamil Zielinski
相关产品推荐
相关产品推荐

