交叉点未合并属性枚举

时间:2018-07-02 17:35:31

标签: typescript

我正在尝试在 Typescript v2.9.1 中创建一个交集类型,其中两种类型都有给定的属性,但类型不同: const newItems: A[] & B[] = [];

提供以下界面:

export interface A {
    category: EnumA;
}

export interface B {
    category: EnumB;
}

export enum EnumA {
    bar
}

export enum EnumB {
    foo
}

EnumAEnumB具有与它们关联的不同值,我想知道集合中所有这些值。

但是,如果我尝试执行类似过滤器的操作: const filteredItems = newItems.filter(i => i.category !== EnumB.foo);

我收到一条语法错误,指出Operator '!==' cannot be applied to types 'A' and 'EnumB.foo',在智能感知中,i.category的类型列为EnumA

我希望Typescript了解i.category的类型为EnumA & EnumB。这是错误还是我有不合理的期望?

1 个答案:

答案 0 :(得分:1)

似乎您不需要数组的交集(如您所写,A[] & B[],因为这意味着“这必须具有Array<A>的所有属性,然后具有{ {1}},之前未在此处列出”。而且,由于属性集是相同的(它们的类型有所不同),所以所有属性都取自Array<B>

如果您按以下方式编写代码,则会编译您使用的代码:

Array<A>

因为现在const newItems: (A & B)[] = []; const filteredItems = newItems.filter(i => i.category !== EnumB.foo); 被键入为“事物数组,它们每个都是newItemsA”。它们的B属性为category,即enum,因此可以合并。然后,将其命名为object