gpt4 book ai didi

typescript - 省略 TypeScript 中的联合

转载 作者:行者123 更新时间:2023-12-04 12:56:46 25 4
gpt4 key购买 nike

假设我有两个接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com