typescript - 联合类型不能作为“几种类型之一”
问题描述
我想定义 A 和 B 类型的类型联合。据我从文档中了解到的结果类型应该是代表 A 或 B 类型的类型。令人惊讶的是,我能够同时拥有paramA
和类型。为什么会发生这种情况以及如何创建将返回结果的类型?paramB
UnitedAB
type 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
解决方案
这里的重要部分稍后在文档中
联合类型在这里可能有点棘手,但只需要一点直觉就可以习惯。如果一个值的类型为 A | B,我们只知道它有 A 和 B 都有的成员。在此示例中,Bird 有一个名为 fly 的成员。我们不能确定变量类型是否为 Bird | 鱼有飞法。如果变量在运行时确实是 Fish,则调用 pet.fly() 将失败。
通常,您会有意地拥有 anA
或 aB
并将其分配给一个属性或参数,该属性或参数接受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);
}
}
推荐阅读
- database - 如何使用 awk 处理 ASCII 不可打印字符
- javascript - php变量通过javascript获取后如何转换为float?Php 的 (float) 转换函数返回 0 并且不转换
- c# - 从 JSON 中创建动态对象,忽略空字段
- python - 将列表拆分为批次以处理每个批次中的元素多线程
- sed - 如何用多行格式的多行替换一行?
- azure-data-factory - 通过 Azure 数据工厂加载 JSON 文件
- c - 为什么可以在嵌套循环中声明 STRUCT?
- reactjs - 如何为 React Native 中的 setState 切换通用处理程序
- java - 无法建立实体管理器工厂 - JPA/Hibernate
- python - 我可以声明不兼容的 python 依赖项吗?