TypeScript函数泛型类型的交集行为不正确

ple*_*top 1 typescript

interface A {
  a: number;
}

let myVar: A = {
  a: 123
};

myVar = Object.assign({}, myVar, {
  b: 456
});
Run Code Online (Sandbox Code Playgroud)

为什么TypeScript不会抱怨myVar通过Object.assign()调用重新分配?

鉴于该Object.assign()调用的类型定义是:

assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;
Run Code Online (Sandbox Code Playgroud)

...和我的调用中三种类型的(返回类型)交集不匹配interface A,编译器不应该选择那个吗?

问题与TypeScript无法推断函数调用中的类型无关,因为如果我将代码更改为:

interface A {
  a: number;
}

interface B {
  b: number;
}

interface C {}

let myVar: A = {
  a: 345
};

myVar = Object.assign<C, A, B>({}, myVar, {
  b: 345
});
Run Code Online (Sandbox Code Playgroud)

......它仍然没有抱怨.

我正在使用TypeScript 2.2.1并且"noImplicitAny"编译器标志设置为"true".

Ale*_* L. 5

TypeScript结构类型系统的基本规则是,如果y至少与x具有相同的成员,则x与y兼容

将此规则应用于您的示例 - AA&B&C以下内容兼容:

let abc:A&B&C = {a:123, b:456};
Run Code Online (Sandbox Code Playgroud)

任务let a:A = abc;完全有效.

更多信息在这里