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 }
原理说明
- 收集所有键:
T extends any ? keyof T : never利用条件类型的分发特性,遍历联合类型的每个分支,提取所有分支的键,最终得到所有可能的键的联合(此处为"A" | "B")。 - 精准提取值类型:对于每个键
K,通过T extends { [P in K]: infer V } ? V : never筛选出联合类型中包含K的分支,并推断该分支中K对应的值类型V,避免了因部分分支无该键而产生的unknown。
内容的提问来源于stack exchange,提问作者TrevTheDev
相关产品推荐
相关产品推荐

