如何在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
相关产品推荐
相关产品推荐

