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

如何在TypeScript中使用可变元组类型?为基础wrap/unwrap系列函数添加类型定义

理解TypeScript可变元组类型:超基础示例

我太懂这种找不到超基础示例的憋屈了!可变元组类型刚接触的时候确实有点摸不着头脑,我来给你把这四个函数的类型定义一步步理清楚,保证看完你就能get到核心逻辑。

1. wrap 函数(剩余参数版本)

这个函数接受任意数量的不同类型参数,返回每个参数被 { value: ... } 包裹后的元组:

function wrap<T extends unknown[]>(...items: T): { [K in keyof T]: { value: T[K] } } {
  // 用as断言是因为map默认返回数组,TypeScript无法自动推断成元组
  return items.map(item => ({ value: item })) as { [K in keyof T]: { value: T[K] } };
}

关键逻辑:

  • 泛型 T extends unknown[] 用来捕获传入的参数元组类型(比如你传 wrap(4, 'foo'),T 就是 [number, string])
  • { [K in keyof T]: { value: T[K] } } 是映射元组:遍历元组的每个索引 K,把原元素类型 T[K] 转换成 { value: T[K] },这样返回的类型和输入元组一一对应,而不是宽泛的数组。

2. wrapArray 函数(数组参数版本)

和 wrap 逻辑一致,只是参数是数组/元组而非剩余参数:

function wrapArray<T extends unknown[]>(items: T): { [K in keyof T]: { value: T[K] } } {
  return items.map(item => ({ value: item })) as { [K in keyof T]: { value: T[K] } };
}

3. unwrap 函数(剩余参数版本)

这个函数接受多个 { value: ... } 类型的参数,返回提取出 value 后的元组:

function unwrap<T extends { value: unknown }[]>(...items: T): { [K in keyof T]: T[K]['value'] } {
  return items.map(item => item.value) as { [K in keyof T]: T[K]['value'] };
}

关键逻辑:

  • 泛型 T extends { value: unknown }[] 捕获传入的包裹后的元组类型(比如 [{ value: 4 }, { value: 'foo' }])
  • { [K in keyof T]: T[K]['value'] } 遍历元组每个元素,提取出 value 属性的类型,最终返回和输入元组对应的原始类型元组。

4. unwrapArray 函数(数组参数版本)

和 unwrap 逻辑一致,参数是数组/元组:

function unwrapArray<T extends { value: unknown }[]>(items: T): { [K in keyof T]: T[K]['value'] } {
  return items.map(item => item.value) as { [K in keyof T]: T[K]['value'] };
}

测试代码:让类型正常工作

注意这里要给 items 加 as const,让TypeScript把它推断成只读元组而不是宽泛的数组,这样才能保留每个元素的具体类型:

const items = [{ value: 4 }, { value: 'foo' }] as const;
const [num, str] = unwrap(...items);

console.log(num.toFixed(2)); // ✅ num是number类型,正常调用toFixed
console.log(str.charAt(0)); // ✅ str是string类型,正常调用charAt

如果不加 as const,TypeScript会把 items 推断成 Array<{ value: number | string }>,这样 unwrap 返回的就是 (number | string)[],解构后 num 和 str 都是 number | string 类型,就会出现类型错误。

核心总结

可变元组类型的本质就是:用泛型捕获元组的具体结构,再通过映射类型逐个处理元组中的元素,从而保留每个元素的精确类型,而不是把元组降级成宽泛的数组类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 20:42:30