TypeScript如何将判别式联合类型转换为对象类型?
基于判别式联合类型自动推导对象类型
假设我们有如下的枚举和判别式联合类型:
enum KEYS { A = 'a', B = 'b' // 可扩展更多枚举成员 } type TUnion = | { keyType: KEYS.A; items: AType[] } | { keyType: KEYS.B; items: BType[] } // 可扩展更多联合成员
如果手动定义以KEYS成员为键、对应items类型为值的对象类型,会重复键与值的关联逻辑:
type TObj = { [KEYS.A]?: AType[] [KEYS.B]?: BType[] // 新增成员时需手动同步 }
我们可以利用TypeScript的映射类型+条件类型,自动推导该对象类型,无需手动重复关联:
实现方案
// 自动推导的对象类型 type TObj = { [K in KEYS]?: Extract<TUnion, { keyType: K }>['items']; };
原理说明
[K in KEYS]:遍历KEYS的所有枚举成员,作为对象的键。Extract<TUnion, { keyType: K }>:从TUnion中筛选出keyType匹配当前键K的联合成员。['items']:提取筛选出的成员中items属性的类型。- 可选属性标记
?:保持和手动定义的TObj结构一致,所有键均为可选。
验证示例
// 定义测试类型 type AType = number; type BType = string; // 枚举与联合类型 enum KEYS { A = 'a', B = 'b' } type TUnion = | { keyType: KEYS.A; items: AType[] } | { keyType: KEYS.B; items: BType[] }; // 自动推导对象类型 type TObj = { [K in KEYS]?: Extract<TUnion, { keyType: K }>['items']; }; // 最终推导结果等价于: // type TObj = { // a?: number[] | undefined; // b?: string[] | undefined; // }
当后续扩展KEYS或TUnion的成员时,TObj会自动同步更新,无需手动修改。
内容的提问来源于stack exchange,提问作者bebbi
相关产品推荐
相关产品推荐

