typescript - 省略 TypeScript 中的联合

标签 typescript types

假设我有两个接口(interface),XY ,它们共享一些字段,但也有独立的字段:

interface X {
  abc: number;
  foo: number;
  bar: number;
}

interface Y {
  abc: number;
  foo: number;
  baz: number;
}
现在我创建了这些类型的联合:
type Z = X | Y;
结果类型为 either X or Y ,这很好。现在我使用 Omit 删除常见字段之一:
type limitedZ = Omit<Z, 'foo'>;
我期望的是 limitedZ具有以下形式:
{ abc: number, bar: number } | { abc: number, baz: number }
相反,独立字段消失了,剩下的就是 abc双方共享的字段。这是为什么?
这是一个 demo link

最佳答案

为了使用工会完成您想要的事情,您可以这样做 - 但它不会做您期望的事情type limitedZ = Omit<X, 'foo'> | Omit<Y, 'foo'>由管道表示的联合几乎是 XOR,因此结果的类型必须是一种或另一种,即 X 或 Y,或两种类型共有的键(因此不是真正的异或)。这就是您得到意外输出的原因。如果您想简单地从这两种类型中删除 foo ,这将起作用,但它不会创建一个类型,其中 X 和 Y 的键被合并(看起来像)。 This会比我更好地解释这部分。
我假设当您调用 Omit<Z, 'foo'> 时typescript 创建一个由两种类型的公共(public)键组成的类型,即 abc 和 foo,然后您删除 foo,因此只剩下 abc。
如果你想创建一个具有 x 键和 y 键的类型 - 你需要做这样的事情来创建一个交集类型。type ThirdType = X & Y这种类型现在拥有 X 的所有键和 Y 的所有键。然后你可以限制它以删除 foo - 我认为这是你想要做的。type FourthType = Omit<ThirdType, 'foo'>或者在一行中完成所有操作type limitedZ = Omit<X & Y, 'foo'>这是否有助于解释发生了什么?

关于typescript - 省略 TypeScript 中的联合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65824350/

相关文章:

javascript - 在 Javascript 中导入 Typescript 文件

reactjs - 为子文件夹声明模块

javascript - 使用函数式编程 [filter, map, some, reduce etc] 在 Typescript 中过滤数组

java - 如何在 Java 中创建无类型/通用参数?

xml - 如何确定 Powershell 中的 XML 类型?

F#:如何创建除 Double 之外的任何其他类型的元素矩阵

java - 如何将这种鸭子类型(duck typing)(Python)转换为 Java 泛型?

javascript - 在组件/页面之间传递对象

typescript - 为什么我可以在 Typescript 中创建不可能的交集类型?

Javax.persistence 与 @Entity bean 将 int[] 保存为 bytea (postgres)