gpt4 book ai didi

typescript - 取受歧视工会的补充

转载 作者:搜寻专家 更新时间:2023-10-30 21:34:39 24 4
gpt4 key购买 nike

假设我有以下可区分的联合和一些关联类型

type Union = 'a' | 'b';
type Product<A extends Union, B> = { f1: A, f2: B};
type ProductUnion = Product<'a', 0> | Product<'b', 1>;

现在我可以通过使用映射类型和 Exclude

进行补码
type UnionComplement = {
[K in Union]: Exclude<Union, K>
};
// {a: "b"; b: "a"}

type UnionComplementComplement = {
[K in Union]: Exclude<Union, Exclude<Union, K>>
};
// {a: "a"; b: "b"}

到目前为止,所有这些都是有道理的,但是当我尝试采用双补码时,ProductUnion 的情况就出现了问题。第一个补充工作正常

type ProductComplement = {
[K in Union]: Exclude<ProductUnion, { f1: K }>
};
// {a: Product<'b', 1>; b: Product<'a', 0>}

无论我怎么尝试,双补都是不正确的

type ProductComplementComplement = {
[K in Union]: Exclude<ProductUnion, Exclude<ProductUnion, { f1: K }>>
};
// {a: ProductUnion; b: ProductUnion}

我不明白错误在哪里,因为如果我替换类型,它应该可以工作。 K 在取双补码时只有 2 个值,所以让我们尝试第一个

type First = Exclude<ProductUnion, Exclude<ProductUnion, { f1: 'a' }>>;
// {f1: 'a'; f2: 0}

第二个也可以

type Second = Exclude<ProductUnion, Exclude<ProductUnion, { f1: 'b' }>>;
// {f1: 'b'; f2: 1}

所有组成部分都可以工作,但是当在映射类型中组合时,它似乎会崩溃。我在这里缺少什么?

一时兴起,我尝试添加一个类型参数以查看通过抽象补充过程会发生什么

type Complementor<T> = {
[K in Union]: Exclude<T, { f1: K }>
};

type DoubleComplementor<T> = {
[K in Union]: Exclude<T, Exclude<T, { f1: K }>>
};

现在,如果我将参数化类型应用到 ProductUnion,它会完全按照我的预期工作

type Complement = Complementor<ProductUnion>;
// {a: Product<'b', 1>; b: Product<'a', 0>}

type DoubleComplement = DoubleComplementor<ProductUnion>;
// {a: Product<'a', 0>; b: Product<'b', 0>}

最佳答案

这确实是一个错误:https://github.com/Microsoft/TypeScript/issues/28824 .感谢 Anders 和团队,下一个版本应该有更一致的行为。

关于typescript - 取受歧视工会的补充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53588514/

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