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

TypeScript中能否将对象拆分为其属性构成的联合类型?

TypeScript 对象类型拆分为单属性联合类型

我有如下对象:

const obj ={
    list: ["Example1", "Example2"],
    settings: {isEnabled: true, version: "v1.1"},
    extra: {1: "", 2: "", 3: ""}
}

我希望将obj的类型拆分为其属性构成的联合类型,即每个类型只包含原对象的一个属性:

type ObjType = typeof obj;
type Expected = 
  {list: Array<string>} | 
  {settings: {isEnabled: boolean, version: string}} | 
  {extra: {1: string, 2: string, 3: string}};

请问这是否可行?


我的尝试

我尝试了以下写法,但无法实现预期效果,我知道需要递归,但不知道具体怎么写:

// 这个写法不行,我想知道怎么引入递归
type Split<T extends {}> = [keyof T] extends [c: infer C1, ...rest: infer C2] ? C1 | C2 : "1"; 
type Split1<T extends {}> = [keyof T] extends (infer C1 | infer C2) ? {[C1]: any} | {[C2]: any} : "1"; 

type result = Split<ObjType>;
type result1 = Split1<ObjType>;

解决方案

可行,不需要复杂递归,利用映射类型和索引访问类型就能实现。核心思路是先把每个属性映射为仅包含该属性的对象类型,再提取这些类型的联合。

实现代码:

const obj = {
    list: ["Example1", "Example2"],
    settings: { isEnabled: true, version: "v1.1" },
    extra: { 1: "", 2: "", 3: "" }
};

type ObjType = typeof obj;

// 核心类型:将对象拆分为单属性联合类型
type SplitObject<T extends object> = {
    [K in keyof T]: { [P in K]: T[P] }
}[keyof T];

type Expected = SplitObject<ObjType>;

逻辑解释

  1. 第一步{ [K in keyof T]: { [P in K]: T[P] } }:创建一个映射类型,原对象的每个属性K都会被转换为一个仅包含K属性的对象类型,值类型完全继承原对象对应属性的类型。
  2. 第二步[keyof T]:通过索引访问映射类型的所有值,自动将这些单属性对象类型合并为联合类型,得到最终需要的结果。

内容的提问来源于stack exchange,提问作者Sonny D

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:38:20