我正在尝试在 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
。
我希望Typescript了解i.category
的类型为EnumA & EnumB
。这是错误还是我有不合理的期望?
答案 0 :(得分:1)
似乎您不需要数组的交集(如您所写,A[] & B[]
,因为这意味着“这必须具有Array<A>
的所有属性,然后具有{ {1}},之前未在此处列出”。而且,由于属性集是相同的(它们的类型有所不同),所以所有属性都取自Array<B>
。
如果您按以下方式编写代码,则会编译您使用的代码:
Array<A>
因为现在const newItems: (A & B)[] = [];
const filteredItems = newItems.filter(i => i.category !== EnumB.foo);
被键入为“事物数组,它们每个都是newItems
和A
”。它们的B
属性为category
,即enum
,因此可以合并。然后,将其命名为object
。