TypeScript函数泛型类型交集行为不正确
为什么TypeScript不抱怨通过TypeScript函数泛型类型交集行为不正确,typescript,Typescript,为什么TypeScript不抱怨通过Object.assign()调用重新分配myVar 假定该对象.assign()调用的类型定义为: interface A { a: number; } let myVar: A = { a: 123 }; myVar = Object.assign({}, myVar, { b: 456 }); …它仍然没有抱怨 我使用的是TypeScript 2.2.1,“noImplicitAny”编译器标志设置为“true”。 TypeScript
Object.assign()
调用重新分配myVar
假定该对象.assign()
调用的类型定义为:
interface A {
a: number;
}
let myVar: A = {
a: 123
};
myVar = Object.assign({}, myVar, {
b: 456
});
…它仍然没有抱怨
我使用的是TypeScript 2.2.1,“noImplicitAny”编译器标志设置为“true”。
TypeScript的结构类型系统的基本规则是,如果y至少具有与x相同的成员,那么x与y是兼容的
将此规则应用于示例-A
与A&B&C
兼容:
interface A {
a: number;
}
interface B {
b: number;
}
interface C {}
let myVar: A = {
a: 345
};
myVar = Object.assign<C, A, B>({}, myVar, {
b: 345
});
赋值设a:a=abc代码>是完全有效的
更多信息
TypeScript的结构类型系统的基本规则是,如果y至少具有与x相同的成员,那么x与y是兼容的
将此规则应用于示例-A
与A&B&C
兼容:
interface A {
a: number;
}
interface B {
b: number;
}
interface C {}
let myVar: A = {
a: 345
};
myVar = Object.assign<C, A, B>({}, myVar, {
b: 345
});
赋值设a:a=abc代码>是完全有效的
更多信息
如果A
可分配给X
或B
可分配给X
,则A&B
可分配给X
假设TypeScript使用了,则不会出现错误的原因是,myVar
的重新赋值从源/原始myVar
(第二个参数)获取属性,并从那时起得到满足。因此,当涉及到满足myVar
类型时,任何其他混入的对象(例如第一个和第三个参数)都是无关的
如果A
可分配给X
或B
可分配给X
,则A&B
可分配给X
假设TypeScript使用了,则不会出现错误的原因是,myVar
的重新赋值从源/原始myVar
(第二个参数)获取属性,并从那时起得到满足。因此,当涉及到满足myVar
类型时,任何其他混入的对象(例如第一个和第三个参数)都是无关的
我觉得这个答案令人困惑,尽管它确实让我思考了真正的原因。我认为我的回答更简洁准确。我引用了官方打字稿中的一段话。到底什么是令人困惑的?在你链接的文档页面的上下文中,这句话是有意义的,但在这个问题的上下文中,它是令人困惑和误导的。我为否决票道歉,我试图摆脱它,因为你确实帮助我找到了答案,但它不允许我。我发现这个答案令人困惑,尽管它确实让我思考了真正的原因。我认为我的回答更简洁准确。我引用了官方打字稿中的一段话。到底什么是令人困惑的?在你链接的文档页面的上下文中,这句话是有意义的,但在这个问题的上下文中,它是令人困惑和误导的。我为否决票道歉,我试图摆脱它,因为你确实帮助我找到了答案,但它不允许我。你的例子中没有XmyVar
被定义为A
,因此它肯定可以存储类型A&B
的值。我知道在我的示例中没有X
,我试图将引号中的X
与示例中的等价(myVar
)关联起来。X
在您的示例中是A
,所以=>A&B可分配给A,如果A可分配给A或B可分配给A,那么A&B可分配给A你失去了我,我认为你错了。我很确定X
指的是一个变量,而不是该上下文中的一种类型。你回答中的错误点是你将myVar
(变量)与X
(类型)相关联。你的例子中没有XmyVar
被定义为A
,因此它肯定可以存储类型A&B
的值。我知道在我的示例中没有X
,我试图将引号中的X
与示例中的等价(myVar
)关联起来。X
在您的示例中是A
,所以=>A&B可分配给A,如果A可分配给A或B可分配给A,那么A&B可分配给A你失去了我,我认为你错了。我很确定X
指的是一个变量,而不是该上下文中的一种类型。你回答中的错误点是你将myVar
(变量)与X
(类型)相关联。
let abc:A&B&C = {a:123, b:456};