Typescript 联合类型不能像';几种类型之一';
我想定义A和B类型的类型并集。据我从文档中了解,生成的类型应该是表示A或B类型的类型。令人惊讶的是,我能够在Typescript 联合类型不能像';几种类型之一';,typescript,Typescript,我想定义A和B类型的类型并集。据我从文档中了解,生成的类型应该是表示A或B类型的类型。令人惊讶的是,我能够在UnitedAB类型中同时使用paramA和paramB。为什么会发生这种情况?如何创建返回类型A或类型B结果的类型 A型={ 帕拉玛:任何; }; B类={ paramB:任何; }; 类型UnitedAB=A | B; 常数a:UnitedAB={paramA:1,paramB:2}//好的(为什么?) 常数b:UnitedAB={paramA:1}//好啊 常数c:UnitedAB=
UnitedAB
类型中同时使用paramA
和paramB
。为什么会发生这种情况?如何创建返回类型A或类型B
结果的类型
A型={
帕拉玛:任何;
};
B类={
paramB:任何;
};
类型UnitedAB=A | B;
常数a:UnitedAB={paramA:1,paramB:2}//好的(为什么?)
常数b:UnitedAB={paramA:1}//好啊
常数c:UnitedAB={param12:1}//错误
此处的重要部分将在后面的
联合类型在这里可能有点棘手,但需要一点直觉才能习惯如果一个值的类型为a | B,我们只能确定它有a和B都有的成员。在本例中,Bird有一个名为fly的成员。我们无法确定类型为Bird | Fish的变量是否有fly方法。如果变量在运行时真的是鱼,那么调用pet.fly()将失败
通常情况下,您会有一个A
或B
,并将其分配给接受A | B
的属性或参数,但也有一些方法让该代码稍后知道或辨别它实际上是A
还是B
文档中的下一节将介绍实现这一点的方法
以下是一个例子:
class A {
type = 'A';
paramA: any;
};
class B {
type = 'B';
paramB: any;
};
type UnitedAB = A | B;
function isA(aOrB: A | B): aOrB is A {
return aOrB.type === 'A';
}
function isB(aOrB: A | B): aOrB is B {
return aOrB.type === 'B';
}
const a = new A();
function takesAOrB(aOrB: A | B): void {
if (isA(aOrB)) {
console.log(aOrB.paramA);
} else if (isB(aOrB)) {
console.log(aOrB.paramB);
}
}
有没有办法获得
A或B
类型?所以用户将不能在结果类型上同时使用paramA
和paramB
。您可以使用“知道”如何区分A
和B
的类型缩小功能,然后您的代码可以只使用A
属性或B
属性。我看不出这个答案解决了这个问题:为什么类型A | B
接受可分配给A
和B
的值,也称为A&B
?答案是联合类型中的“或”是包含的,而不是独占的。排他性对象联合在TypeScript中表达起来更复杂,但可以使用条件类型,如上面链接问题的答案所示。@jcalz是的,这个问题可以解决,但如果我们在联合上下文中使用之前专注于声明/创建狭义类型的对象,则不需要这样做。我一直在写这样的代码,从来没有发现需要使用“独占对象联合”。我确信用例是存在的,但我不认为这里有必要使用它。因此,我试图回答如何使用Typescript联合类型来处理一种类型或另一种类型的东西。重复的@jcalz对于初学者来说,这可能更容易找到,因为我+这个问题中的任何答案都不会重复当前的答案,也可能是重复的。在我看来,当你说“A
或B
”时,你的意思是异或,它不是TS中的内置类型运算符。如果链接的问题不能解决你的问题,请告诉我。就我所知,下面的答案并没有解决这个问题,但我很高兴能看到其他答案。