如何将枚举值集合关联到泛型类型?期望IModel的value为枚举值联合
解决IModel的value类型为枚举值联合类型的问题
枚举类型与字符串字面量联合类型的差异
你提到的Vehicle枚举类型和'CAR' | 'BICYLE' | 'TRAIN' | 'SCOOTER'字符串字面量联合类型并不完全等价:
- 枚举类型的取值只能是枚举成员(比如
Vehicle.Car),直接赋值字符串字面量'CAR'会触发类型错误(除非用类型断言或特定编译选项);而字符串字面量联合类型允许直接使用对应的字符串值。 - 在类型收窄、类型推断等场景,两者的表现也存在细微区别。
实现目标类型的方案
要让IModel的value属性类型为枚举值的联合类型,你可以通过Vehicle[keyof Vehicle]来获取枚举值的类型集合,再将其传入VLabel的泛型参数:
export interface VLabel<T = string> { value: T label: string } export enum Vehicle { Car = 'CAR', Bicyle = 'BICYLE', Train = 'TRAIN', Scooter = 'SCOOTER', } // 使用Vehicle[keyof Vehicle]获取枚举值的联合类型 export interface IModel extends VLabel<Vehicle[keyof Vehicle]> {}
此时IModel['value']的类型就是你需要的'CAR' | 'BICYLE' | 'TRAIN' | 'SCOOTER'。
验证效果
修改后,你可以直接用字符串字面量给value赋值,类型检查完全通过:
const validModel: IModel = { value: 'CAR', label: '汽车' };
如果保留原来的VLabel<Vehicle>,上述代码会报错,因为'CAR'不属于Vehicle枚举类型的合法取值,必须写成Vehicle.Car才能通过检查。
内容的提问来源于stack exchange,提问作者user21357723
相关产品推荐
相关产品推荐

