我正在尝试在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
}
EnumA
和EnumB
具有与之关联的不同值,我希望了解集合中的所有这些值。
但是,如果我尝试执行类似过滤器的操作:const filteredItems = newItems.filter(i => i.category !== EnumB.foo);
我收到一个语法错误,指出Operator '!==' cannot be applied to types 'A' and 'EnumB.foo'
并且i.category
的类型在智能感知中列为EnumA
。
我希望打字稿了解要EnumA & EnumB
i.category
的类型。这是一个错误还是我有不合理的期望?
似乎你不需要数组的交集(A[] & B[]
,正如你所写的(,因为它意味着"这必须具有Array<A>
的所有属性,然后是Array<B>
的所有属性,这之前没有在这里列出"。而且由于属性集是相同的(它们只是类型不同(,因此它们都取自Array<A>
.
如果您按如下方式编写,则使用的代码将编译:
const newItems: (A & B)[] = [];
const filteredItems = newItems.filter(i => i.category !== EnumB.foo);
从现在开始,newItems
被键入为"事物数组,每个事物既A
又B
"。它们的category
性质是enum
的,即只是object
,因此可以合并。然后,我们将把它作为enumA & enumB
.