作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
假设我有以下可区分的联合和一些关联类型
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/
我一直在使用标记的联合类型来处理 typescript 歧视,但我遇到了一些奇怪的事情。如果我打开实际的对象属性,一切都会按预期工作。但是如果我使用解构,typescript 会报错。我认为它与编译时
我正在创建一个动态小部件,它可以是空的也可以是已填充的。它应该默认为空。当populated={true} , 我想要 totalGross和 totalNet需要的值。否则,不应允许使用这 2 个
我是一名优秀的程序员,十分优秀!