假设我有两个接口(interface),X
和 Y
,它们共享一些字段,但也有独立的字段:
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/