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

TypeScript中如何将联合类型Foo扁平化为{ A?: string; B?: number }?

解决TypeScript联合类型扁平化后类型丢失问题

原代码中的Flatten工具类型处理联合类型时,会出现值类型变为unknown的问题——这是因为访问联合类型中部分分支不存在的键时,TypeScript会将其推断为unknown。

修改后的实现

type Foo = { A: string } | { B: number }

type Flatten<T> = {
  [K in T extends any ? keyof T : never]?: T extends { [P in K]: infer V } ? V : never
}

type Bar = Flatten<Foo> // 类型为 { A?: string; B?: number }

原理说明

  1. 收集所有键:T extends any ? keyof T : never利用条件类型的分发特性,遍历联合类型的每个分支,提取所有分支的键,最终得到所有可能的键的联合(此处为"A" | "B")。
  2. 精准提取值类型:对于每个键K,通过T extends { [P in K]: infer V } ? V : never筛选出联合类型中包含K的分支,并推断该分支中K对应的值类型V,避免了因部分分支无该键而产生的unknown。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:32:27