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

如何基于对象数组动态生成TypeScript类型而非手动定义字面量?

动态提取对象数组的字面量联合类型

要实现无需手动定义字面量,从对象数组自动生成'a' | 'b' | 'c'这类联合类型,核心是让TypeScript保留数组元素的字面量类型,再通过类型操作提取目标属性:

步骤1:锁定数组的字面量类型

默认情况下TypeScript会把数组元素的name推断为宽泛的string,需要用as const断言锁定字面量类型:

const items = [
  { name: 'a' },
  { name: 'b' },
  { name: 'c' },
] as const;

如果是分开定义对象,同样要给每个对象加as const:

const testA = { name: 'a' } as const;
const testB = { name: 'b' } as const;
const testC = { name: 'c' } as const;

const items = [testA, testB, testC] as const;

步骤2:动态生成联合类型

通过TypeScript的类型操作提取name的联合类型:

// 获取数组的类型
type ItemsArray = typeof items;
// 提取数组元素的联合类型,再取name属性的类型
type PossibleNames = ItemsArray[number]['name'];

此时PossibleNames会被自动推断为'a' | 'b' | 'c',后续修改数组中的name值,这个类型会自动同步更新。

关键知识点

  • as const:将对象、数组的类型锁定为字面量类型,避免值被宽泛推断为string/number等基础类型。
  • ItemsArray[number]:获取数组所有元素的联合类型,即{ readonly name: 'a' } | { readonly name: 'b' } | { readonly name: 'c' }。
  • 索引访问['name']:从元素联合类型中提取name属性的类型,得到最终的字面量联合类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 08:25:04