如何在TypeScript中给泛型函数参数设置identity默认值
问题原因
你的代码报错核心原因是extent的泛型参数K未设置默认类型,当省略map参数时,TypeScript 3.6无法自动将K推导为和T一致的类型,因此泛型的identity函数无法匹配到(value: T) => K的类型声明。
修正方案
你可以通过给泛型参数K设置默认值,同时调整map参数的类型兼容默认场景即可:
function identity<T>(value: T): T { return value; } // 给K添加默认类型为T function extent<T, K = T>( values: T[], // 类型断言保证类型安全,同时兼容默认和自定义映射两种场景 map: (value: T) => K = identity as (value: T) => K ): [K, K] | undefined { let min: T | undefined; let max: T | undefined; // ... 业务逻辑 ... return min === undefined || max === undefined ? undefined : [map(min), map(max)]; }
调用验证
- 省略
map参数,默认返回和输入元素同类型的极值对:
// 返回类型为 [number, number] | undefined extent([1,3,5,2])
- 传入自定义
map参数做类型映射:
// 返回类型为 [string, string] | undefined extent([1,3,5,2], v => v.toString())
说明
这里给identity添加的类型断言as (value: T) => K是完全安全的:当用户未传入map参数时,K会取默认值T,此时identity的类型和要求的参数类型完全匹配,该断言仅用来解决TypeScript 3.6对泛型函数默认值匹配的校验问题。
内容的提问来源于stack exchange,提问作者Vitaly
相关产品推荐
相关产品推荐

