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

时间:2017-02-27 00:15:04

标签: typescript

_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”。

2 个答案:

答案 0 :(得分:5)

  

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

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

let abc:A&B&C = {a:123, b:456};

作业let a:A = abc;完全有效。

更多信息here

答案 1 :(得分:0)

  如果A & B可分配给XA可分配给X,则

B可分配给X

鉴于TypeScript使用structural type system,没有错误的原因是因为重新分配myVar从源/原始myVar获取属性(第二个参数)并且从那时起就满意了。因此,在满足myVar的类型时,任何混入的其他对象(例如第一和第三个参数)都无关紧要。

Quote source