You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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} ])

原实现问题说明

  1. 之前的泛型定义中将X、Y设为带默认值的参数,TS的泛型推导规则中,带默认值的泛型参数不会主动从实参反向推导,会优先使用默认值,因此所有类型都被推导为unknown。
  2. 无需额外拆分X、Y两个独立泛型,直接对入参元组T做整体映射类型计算即可,TS可以自动识别元组的长度和每个位置的Param子类型。
  3. 入参处使用[...T]可变元组语法,是为了提示TS将传入的数组字面量推导为固定长度的元组类型,而不是加宽为Param[]类型,这样才能保留每个位置的独立类型。

内容的提问来源于stack exchange,提问作者artysidorenko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 13:27:03