TypeScript中能否基于数组对象属性值定义字面量联合类型
完全可以实现,你只需要先给原数组添加as const断言锁定字面量类型,再从数组类型中提取name属性的联合类型即可。
首先调整原数组的定义,添加as const:
const a = [ { name: 'n1', text: 't1', }, { name: 'n2', text: 't2', }, { name: 'n3', text: 't3', }, ] as const;
之后按如下方式定义目标类型:
type T = typeof a[number]['name'];
此时T的类型就会被推导为'n1' | 'n2' | 'n3',完全符合你的需求。如果后续你给数组a新增带name属性的元素,T类型也会自动同步新增对应的字面量类型,不需要手动修改。
原理解释
as const会让 TypeScript 把数组的所有属性推导为不可修改的字面量类型,避免name属性被默认放宽为string类型typeof a[number]可以拿到数组所有元素的类型联合- 最后通过索引访问
['name']即可提取所有元素的name属性值的联合类型
内容的提问来源于stack exchange,提问作者languanghao
相关产品推荐
相关产品推荐

