如何基于对象数组动态生成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
相关产品推荐
相关产品推荐

