Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
TypeScript函数泛型类型交集行为不正确_Typescript - Fatal编程技术网

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

为什么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
类型时,任何其他混入的对象(例如第一个和第三个参数)都是无关的


我觉得这个答案令人困惑,尽管它确实让我思考了真正的原因。我认为我的回答更简洁准确。我引用了官方打字稿中的一段话。到底什么是令人困惑的?在你链接的文档页面的上下文中,这句话是有意义的,但在这个问题的上下文中,它是令人困惑和误导的。我为否决票道歉,我试图摆脱它,因为你确实帮助我找到了答案,但它不允许我。我发现这个答案令人困惑,尽管它确实让我思考了真正的原因。我认为我的回答更简洁准确。我引用了官方打字稿中的一段话。到底什么是令人困惑的?在你链接的文档页面的上下文中,这句话是有意义的,但在这个问题的上下文中,它是令人困惑和误导的。我为否决票道歉,我试图摆脱它,因为你确实帮助我找到了答案,但它不允许我。你的例子中没有X
myVar
被定义为
A
,因此它肯定可以存储类型
A&B
的值。我知道在我的示例中没有
X
,我试图将引号中的
X
与示例中的等价(
myVar
)关联起来。
X
在您的示例中是
A
,所以=>A&B可分配给A,如果A可分配给A或B可分配给A,那么A&B可分配给A你失去了我,我认为你错了。我很确定
X
指的是一个变量,而不是该上下文中的一种类型。你回答中的错误点是你将
myVar
(变量)与
X
(类型)相关联。你的例子中没有X
myVar
被定义为
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};