如何将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.
相关产品推荐
相关产品推荐

