代码之家  ›  专栏  ›  技术社区  ›  Fedoranimus

不合并属性枚举的交集

  •  3
  • Fedoranimus  · 技术社区  · 6 年前

    我正在尝试创建一个交叉点类型 字体脚本2.9.1版 两种类型都具有给定的属性,但具有不同的类型: const newItems: A[] & B[] = [];

    给定以下接口:

    export interface A {
        category: EnumA;
    }
    
    export interface B {
        category: EnumB;
    }
    
    export enum EnumA {
        bar
    }
    
    export enum EnumB {
        foo
    }
    

    EnumA EnumB 具有与它们关联的不同值,我希望了解集合中的所有这些值。

    但是,如果我尝试做一些类似于过滤器的事情: const filteredItems = newItems.filter(i => i.category !== EnumB.foo);

    我收到一个语法错误声明 Operator '!==' cannot be applied to types 'A' and 'EnumB.foo' 以及 i.category 列为 枚举 在智能意义上。

    我希望typescript了解 一、类别 成为 EnumA & EnumB . 这是一个错误还是我有不合理的期望?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Cerberus    6 年前

    看起来你不需要数组的交集( A[] & B[] ,正如您所写),因为它意味着“这必须具有 Array<A> ,然后是 Array<B> , 以前这里没有列出 “。由于这些属性集是相同的(只是类型不同),所以所有这些属性都是从 阵列<A> .

    如果按以下方式编写,则使用的代码将进行编译:

    const newItems: (A & B)[] = [];
    const filteredItems = newItems.filter(i => i.category !== EnumB.foo);
    

    从现在起 newItems 类型为“数组,每一个都是 A B “。他们 category 属性为 enum ,即 object ,因此可以合并。那么,我们就把它当作 enumA & enumB .