2017-02-27 53 views
1
interface A { 
    a: number; 
} 

let myVar: A = { 
    a: 123 
}; 

myVar = Object.assign({}, myVar, { 
    b: 456 
}); 

为什么TypeScript不会抱怨通过Object.assign()调用重新分配myVarTypeScript函数通用类型交集不正确

鉴于该Object.assign()呼叫的类型定义为:

assign<T, U, V>(target: T, source1: U, source2: V): T & U & V; 

...和(返回类型)的三种类型中我的电话的交集不匹配interface A,不应该编译挑那个?

的问题是不相关的打字稿不能够推断出类型的函数调用,因为如果我更改了代码:

interface A { 
    a: number; 
} 

interface B { 
    b: number; 
} 

interface C {} 

let myVar: A = { 
    a: 345 
}; 

myVar = Object.assign<C, A, B>({}, myVar, { 
    b: 345 
}); 

...它仍然不抱怨。

我使用打字稿2.2.1和“noImplicitAny”编译器标志设置为“真”。

回答

4

为打字稿的结构类型系统的基本规则是,X是如果y具有Y的一种相同的成员X

运用这一规则,你的榜样兼容 - AA&B&C兼容:

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

而赋值let a:A = abc;是完全有效的。

更多信息here

+0

我觉得这个答案扑朔迷离,虽然它确实让我思考的真正原因。我认为我的答案更加简洁和准确。 – pleasedesktop

+0

我已经把报价从正式打字[文件](https://www.typescriptlang.org/docs/handbook/type-compatibility.html)。究竟是什么让人困惑? –

+0

在你链接的文档页面的上下文那句话,有一定道理,但它是在这个问题的背景下混乱和误导。我的downvote道歉,我试图摆脱它,因为你没帮我找到了答案,但它不会让我。 – pleasedesktop

0

A & B是分配给X如果A是分配给XB是分配给X

鉴于打字稿使用structural type system,没有错误的原因是因为myVar重新分配会从源/原myVar(第二个参数)的性能,并从此满意。因此,它们会在混合的任何其他对象(例如,第一和第三个参数),是不相关的,当涉及到满足myVar类型。

Quote source

+0

你的例子中没有X. 'myVar'被定义为'A',所以它肯定可以存储类型的值'A&B' –

+0

我知道有没有'X'在我的例子,我试图从报价涉及'X',到在我的例子中相当于('myVar')。 – pleasedesktop

+0

您示例中的'X'是'A',所以=>如果A可分配给A或B可分配给A,则A和B可分配给A –