TypeScript如何根据Enum枚举值实现泛型属性的类型推断
TypeScript 枚举成员映射对应属性类型实现
基础实现(条件类型分支)
枚举项数量较少时,可以直接用条件类型做分支判断,匹配不同枚举成员对应的类型:
enum Foo { One, Two } // 业务自定义类型 type Bar = { commonField: string } type BarOne = Bar & { oneField: number } type BarTwo = Bar & { twoField: boolean } export type MyType<T extends Foo> = { data: T extends Foo.One ? BarOne : T extends Foo.Two ? BarTwo : never }
使用时类型会自动匹配:
// 类型校验通过 const demo1: MyType<Foo.One> = { data: { commonField: "demo", oneField: 123 } } const demo2: MyType<Foo.Two> = { data: { commonField: "demo", twoField: true } }
更优可扩展方案(映射表索引)
如果枚举项较多、后续可能新增枚举成员,嵌套条件类型维护成本高,推荐先建立枚举成员到目标类型的映射表,通过索引访问类型直接取值,扩展性更强:
// 统一维护枚举和对应类型的映射关系,新增枚举只需要在这里加配置 type FooTypeMap = { [Foo.One]: BarOne [Foo.Two]: BarTwo } export type MyType<T extends Foo> = { data: FooTypeMap[T] }
这个方案是类型安全的,如果新增枚举成员后忘记在映射表加对应类型,TS会直接抛出类型错误,避免漏配问题。
内容的提问来源于stack exchange,提问作者Dovmo
相关产品推荐
相关产品推荐

