首页 > 解决方案 > 联合类型不能作为“几种类型之一”

问题描述

联合类型描述的值可以是多种类型之一。

我想定义 A 和 B 类型的类型联合。据我从文档中了解到的结果类型应该是代表 A 或 B 类型的类型。令人惊讶的是,我能够同时拥有paramA和类型。为什么会发生这种情况以及如何创建将返回结果的类型?paramBUnitedABtype A or type B

type A = {
  paramA: any;
};

type B = {
  paramB: any;
};

type UnitedAB = A | B;

const a: UnitedAB = { paramA: 1, paramB: 2 }; //OK (WHY?)
const b: UnitedAB = { paramA: 1}; //ok
const c: UnitedAB = { param12: 1}; //error

标签: typescript

解决方案


这里的重要部分稍后在文档中

联合类型在这里可能有点棘手,但只需要一点直觉就可以习惯。如果一个值的类型为 A | B,我们只知道它有 A 和 B 都有的成员。在此示例中,Bird 有一个名为 fly 的成员。我们不能确定变量类型是否为 Bird | 鱼有飞法。如果变量在运行时确实是 Fish,则调用 pet.fly() 将失败。

通常,您会有意地拥有 anA或 aB并将其分配给一个属性或参数,该属性或参数接受A | B有一些方法让该代码稍后知道或辨别哪个AB它实际上是。

文档中的下一部分,类型保护和区分类型介绍了执行此操作的方法。

这是一个例子:

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);
  }
}

打字稿游乐场


推荐阅读