如何将字符串联合类型转换为对象联合类型?
TypeScript字符串联合类型转对象联合类型的多种实现
问题场景
给定字符串联合类型:
type Letters = 'a'|'b'|'c'|'d';
需要将其转换为以下结构的对象联合类型:
type ObjectsMadeOfLetters = { prop: 'a' }|{ prop: 'b'}|{ prop: 'c' }|{ prop: 'd' };
你已经实现了一种可行方案:
type ObjectsMadeOfLetters = Letters extends infer U ? U extends string ? { prop: U } : never : never;
该方案能得到预期结果:
type ObjectsMadeOfLetters = { prop: 'a'; } | { prop: 'b'; } | { prop: 'c'; } | { prop: 'd'; }
以下是几种其他实现方式:
1. 泛型映射简化版
利用TypeScript对联合类型的分布式映射特性,直接定义泛型类型进行转换:
type WrapWithProp<T extends string> = { prop: T }; type ObjectsMadeOfLetters = WrapWithProp<Letters>;
当泛型参数传入联合类型时,TypeScript会自动遍历每个成员,将其映射为对应的对象类型,最终组合成联合类型。
2. 索引类型推导法
通过创建索引类型再提取值的方式实现:
type ObjectsMadeOfLetters = { [K in Letters]: { prop: K } }[Letters];
步骤说明:
- 首先创建一个以
Letters的每个成员为键的对象类型,每个键对应的值是{ prop: 键 } - 再通过
[Letters]索引访问,取出所有值类型,自动形成联合类型
3. 简化分布式条件类型
去掉冗余的infer,直接利用分布式条件特性:
type ObjectsMadeOfLetters = Letters extends string ? { prop: Letters } : never;
当条件类型的左侧是联合类型时,TypeScript会将每个成员单独代入条件判断,生成对应的对象类型后再合并为联合类型。
内容的提问来源于stack exchange,提问作者rusanovski
相关产品推荐
相关产品推荐

