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

如何将TypeScript对象元组转换为以name属性为键的对象?

TypeScript实现元组到键值对象的类型转换

这个需求完全可以在TypeScript中实现,核心是让类型系统正确捕捉元组中每个对象的name字面量类型,以及对应对象的完整结构。

常见错误原因

你之前的tupleToObject出现类型推断问题,大概率是两个原因:

  • 元组没有用as const断言,导致TypeScript把name推断为宽泛的string类型,而非具体的字面量(比如'fruit');
  • 映射类型时没有精准提取对应name的对象类型,导致每个键对应的是所有对象的联合类型,访问属性时因联合类型的属性不统一而报错。

正确实现方案

先定义精准的tupleToObject类型,再配合as const断言约束元组:

// 定义转换类型:从含name属性的对象元组生成键值类型
type TupleToObject<T extends readonly { name: string }[]> = {
  [K in T[number]['name']]: Extract<T[number], { name: K }>
};

// 示例元组:必须加as const让TypeScript推断字面量类型和完整结构
const components = [
  { name: 'fruit', color: 'red', weight: 100 },
  { name: 'vegetable', type: 'leafy', price: 5 }
] as const;

// 生成目标类型
type Wanted = TupleToObject<typeof components>;

// 使用示例:类型完全正确
const foo: Wanted = {
  fruit: { name: 'fruit', color: 'red', weight: 100 },
  vegetable: { name: 'vegetable', type: 'leafy', price: 5 }
};

// 此时访问foo.fruit.color不会报错,类型推断精准
console.log(foo.fruit.color); // 类型为'red'

关键细节说明

  1. as const断言:强制TypeScript将元组的每个元素推断为只读的字面量类型,保留name的具体值(如'fruit')和对象的所有属性类型,避免被宽泛的string或object类型覆盖。
  2. TupleToObject类型逻辑:
    • T extends readonly { name: string }[]:约束输入必须是只读的、元素含name属性的对象元组;
    • [K in T[number]['name']]:遍历元组中所有对象的name值,作为结果类型的键;
    • Extract<T[number], { name: K }>:从元组元素中精准筛选出name等于当前键K的对象类型,确保每个键对应唯一的对象结构,而非所有对象的联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 12:40:54