You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串联合类型转换为对象联合类型?

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:27:27