我有一些从基础扩展的接口:
enum eItemType { /* … */ }
interface Item {
someCommonKeyValPairCollection: eItemType;
type: eItemType;
weight: number;
// …
}
interface ItemTypeA extends Item {
someKeyValPairCollection: eItemType;
}
interface ItemTypeB extends Item {
someOtherKeyValPairCollection: eItemType;
}
type tItem = Item | ItemTypeA | ItemTypeB
然后我有一个接收Item的方法,但它可能是(非关键字)泛型Item
或ItemTypeA
或ItemTypeB
,所以我创建了union类型{ {1}}。该方法做了一些常见的事情,然后是一些基于tItem
的特定事情(循环遍历item.type
或someKeyValPairCollection
。Typescript吓坏了,抛出了六个分配错误,ex {{1 (没有狗屎)。
该方法大致如下:
someOtherKeyValPairCollection
如何处理Property 'someKeyValPairCollection' is missing in type Item
?
答案 0 :(得分:1)
您需要使用受歧视的联盟。一个联合,其中一个属性(在这种情况下为type
)具有特定类型的特定值。您可以阅读有关here
enum eItemType {
a, b, c
}
interface Item {
someCommonKeyValPairCollection: eItemType;
type: eItemType;
weight: number;
// …
}
interface ItemTypeA extends Item {
type: eItemType.a
someKeyValPairCollection: eItemType;
}
interface ItemTypeB extends Item {
type: eItemType.b
someOtherKeyValPairCollection: eItemType;
}
interface ItemTypeOther extends Item {
type: Exclude<eItemType, eItemType.a | eItemType.b>
}
type tItem = ItemTypeA | ItemTypeB | ItemTypeOther
function processItem(item: tItem): boolean {
if (item.type === eItemType.a) {
item.someKeyValPairCollection
}
else if (item.type === eItemType.b) {
item.someOtherKeyValPairCollection
} else {
item // will be ItemTypeOther
}
return true;
}
修改强>
添加了一个简单的替代方法,可以捕获其余的枚举值,而无需为每个枚举值定义单独的类型或必须单独列出它们。