如何更简洁动态定义联合类型?能否从数组推导该类型?
从对象数组推导严格联合类型的TypeScript实现
当然可以从给定的数组推导对应的严格联合类型,无需手动罗列所有可选值。核心是利用TypeScript的const断言保留字面量类型,再通过类型工具提取目标属性的类型。
具体实现代码
- 用
as const断言定义原始数组,让编译器保留元素的字面量类型:
const mySourceArray = [{ myProperty: 'foo' }, { myProperty: 'bar' }] as const;
- 推导
myProperty的联合类型:
type MyPropertyType = typeof mySourceArray[number]['myProperty']; // 此时 MyPropertyType 等价于 'foo' | 'bar'
- 定义接口并使用推导的类型:
interface MyInterface { myProperty: MyPropertyType; }
- 验证类型约束:
// 符合类型要求,编译通过 const validItems: MyInterface[] = [{ myProperty: 'foo' }, { myProperty: 'bar' }]; // 类型不匹配,编译报错 const invalidItem: MyInterface = { myProperty: 'baz' }; // 错误:'"baz"' 无法赋值给 '"foo" | "bar"'
关键说明
as const是实现的核心:它会将数组转为只读的字面量数组,防止编译器把元素类型拓宽为通用的string。- 后续如果需要新增可选值,只需要修改原始的
mySourceArray,对应的联合类型会自动更新,完全满足动态简洁的需求。
内容的提问来源于stack exchange,提问作者henk
相关产品推荐
相关产品推荐

