TypeScript 4.1 使用扩展表达式推导泛型元组类型问题咨询
解决方案
以下实现完全兼容TS 4.1,无需手动传入泛型参数即可自动推导入参元组长度、每个位置的元素类型,返回对应准确的元组类型:
type Param<X = unknown, Y = unknown> = { x?: X y: Y } // 单个Param元素的返回类型计算 type ParamReturn<T extends Param> = T extends { x: infer X } ? X : T['y'] function func<T extends Param[]>(arg: [...T]): { [K in keyof T]: ParamReturn<T[K]> } { return arg.map(elem => 'x' in elem ? elem.x : elem.y) as any }
调用测试
// 返回值推导为 [string] const res1 = func([ {x: 'string', y: 123} ]) // 返回值推导为 [string, number] const res2 = func([ {x: 'string', y: 123}, {x: 123, y: 'string' } ]) // 无x属性的场景:返回值推导为 [boolean] const res3 = func([ {y: false} ])
原实现问题说明
- 之前的泛型定义中将
X、Y设为带默认值的参数,TS的泛型推导规则中,带默认值的泛型参数不会主动从实参反向推导,会优先使用默认值,因此所有类型都被推导为unknown。 - 无需额外拆分
X、Y两个独立泛型,直接对入参元组T做整体映射类型计算即可,TS可以自动识别元组的长度和每个位置的Param子类型。 - 入参处使用
[...T]可变元组语法,是为了提示TS将传入的数组字面量推导为固定长度的元组类型,而不是加宽为Param[]类型,这样才能保留每个位置的独立类型。
内容的提问来源于stack exchange,提问作者artysidorenko
相关产品推荐
相关产品推荐

