TypeScript中如何将联合类型映射为指定键值结构类型?
解决方案:根据联合类型成员属性生成目标映射类型
你的核心问题在于映射类型的as子句写法错误,导致条件判断没有针对联合类型的单个成员生效。原代码中as MyStructUnion['future_key']会把所有future_key合并成联合类型,每个键对应的K是整个MyStructUnion,因此条件判断返回的是'yes' | number的混合结果。
修改后的代码如下:
type KeyValues = { [K in MyStructUnion as K['future_key']]: K extends { future_value: true } ? 'yes' : number; };
关键说明:
- 把
as MyStructUnion['future_key']改为as K['future_key']:让映射遍历MyStructUnion的每一个独立成员,每个成员对应唯一的future_key值,避免键的重复覆盖和联合类型的混淆。 - 条件判断
K extends { future_value: true }会自动触发分布式条件类型:联合类型的每个成员会单独进行校验,只有明确包含future_value: true的成员会返回'yes',其余情况(future_value为false、undefined或不存在)都返回number。
最终生成的KeyValues类型完全符合你的预期:
type KeyValues = { 'true1': 'yes'; 'false1': number; 'false2': number; 'false3': number; }
内容的提问来源于stack exchange,提问作者Daniel Kaplan
相关产品推荐
相关产品推荐

