使用Conditional Types和Mapped Types
示例代码:
type NoIntersection = T extends object
? {[K in keyof T]: NoIntersection}
: T;
type Foo = Record;
type Bar = NoIntersection;
// Bar类型会排除掉Foo中嵌套对象的交叉类型
// Bar类型的输出为:Record
const obj: Bar = {
foo: {a: 1, b: ["hello"]},
bar: {a: 2, b: ["world"]}
// ...
};
上述代码中,使用了一个名为NoIntersection的条件泛型类型来消除Record类型之间的键交叉。该类型遍历所有的Record键值对,并将值进行递归处理以确保所有嵌套记录的键都没有交叉。
最终,我们可以使用NoIntersection类型来定义最终的类型Bar,并在其声明中使用Record类型的键值对来确保类型的正确性。