Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.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,我想定义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=

我想定义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={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中的内置类型运算符。如果链接的问题不能解决你的问题,请告诉我。就我所知,下面的答案并没有解决这个问题,但我很高兴能看到其他答案。