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

如何将TypeScript中对象值的联合类型转换为交叉类型?

TypeScript:将对象属性的联合类型转为交叉类型

如果你有一个包含多个对象类型的对象(或元组),用T[keyof T]只能拿到内部属性的联合类型,但想要把它转换成交叉类型,可以通过TypeScript的逆变特性实现。

举个例子:

type Dict = {
  info: { name: string; age: number };
  location: { lat: number; long: number };
};

// 期望得到:{ name: string; age: number } & { lat: number; long: number }
type DictIntersection = ???

解决方案

先定义一个辅助类型,利用函数参数的逆变特性将联合类型转为交叉类型:

type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;

然后把这个辅助类型用到你的场景里:

type Dict = {
  info: { name: string; age: number };
  location: { lat: number; long: number };
};

// 先拿到联合类型
type DictUnion = Dict[keyof Dict];
// 再转成交叉类型
type DictIntersection = UnionToIntersection<DictUnion>;

也可以直接合并成一行:

type DictIntersection = UnionToIntersection<Dict[keyof Dict]>;

原理说明

当联合类型出现在函数参数这种逆变位置时,TypeScript会自动将其合并为交叉类型。上面的辅助类型就是通过把每个联合成员包装成函数参数,再通过infer提取出合并后的交叉类型。

元组类型的情况

如果是元组类型,用法类似:

type Tuple = [{ name: string }, { age: number }];
type TupleIntersection = UnionToIntersection<Tuple[number]>; // { name: string } & { age: number }

内容的提问来源于stack exchange,提问作者Adam B.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 14:54:57