_id
为什么TypeScript没有抱怨通过interface A {
a: number;
}
let myVar: A = {
a: 123
};
myVar = Object.assign({}, myVar, {
b: 456
});
来电重新分配myVar
?
鉴于该Object.assign()
调用的类型定义是:
Object.assign()
...我的调用中三种类型的(返回类型)交集与assign<T, U, V>(target: T, source1: U, source2: V): T & U & V;
不匹配,编译器不应该选择它吗?
问题与TypeScript无法推断函数调用中的类型无关,因为如果我将代码更改为:
interface A
......它仍然没有抱怨。
我正在使用TypeScript 2.2.1,并且“noImplicitAny”编译器标志设置为“true”。
答案 0 :(得分:5)
TypeScript的结构类型系统的基本规则是,如果y与x具有至少相同的成员,则x与y兼容
将此规则应用于您的示例 - A
与A&B&C
兼容:
let abc:A&B&C = {a:123, b:456};
作业let a:A = abc;
完全有效。
更多信息here
答案 1 :(得分:0)
如果A & B
可分配给X
或A
可分配给X
,则
B
可分配给X
。
鉴于TypeScript使用structural type system,没有错误的原因是因为重新分配myVar
从源/原始myVar
获取属性(第二个参数)并且从那时起就满意了。因此,在满足myVar
的类型时,任何混入的其他对象(例如第一和第三个参数)都无关紧要。