为什么我无法实例化两种记录类型的交集?



为什么不可能分配给Record<string, A> & Record<string, B>,即使可以为Record<string, A & B>做同样的事情?换句话说,这两个不是相等的吗?

type A = { a: string };
type B = { b: string };
// this compiles
const x: Record<string, A & B> = {
foo: { a: '', b: '' },
};
// this doesn't
const y: Record<string, A> & Record<string, B> = {
foo: { a: '', b: '' },
//            ^^^^^
// Object literal may only specify known properties, and 'b' does not exist in type 'A'.(2322)
};

https://www.typescriptlang.org/play?代码/C4TwDgpgBAglC8UDeUCGAuKBnYAnAlgHYDmUAvgNwBQokUASnIvRAMYD2uAJgDw4EkANLAB81GuGgAhBMigAjTPyKlKEuvRnM2nXsqFQpYqlQ6EcUAB6YWHbnzwrhcAGSGRspFSg + oAM3Z2TBQMKAByMOFFcLDyQSo1U3ZzYCgQG1cGLWRvXwCguVCIqMwIuITqIA

这被认为是TypeScript中的一个错误,将在TypeScript 5.0发布时修复。

见microsoft/TypeScript#51875,我因为这个Stack Overflow问题提交了这个文件。看起来像是与TypeScript 4.8一起发布的microsoft/TypeScript#49503引入了这个问题,作为修复另一个错误的副作用。它将被microsoft/TypeScript#51894修复,并将随TypeScript 5.0一起发布。

最新更新