基于扩展的接口类型的代码分支

时间:2018-04-28 11:13:06

标签: typescript interface extends typescript2.8

我有一些从基础扩展的接口:

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的方法,但它可能是(非关键字)泛型ItemItemTypeAItemTypeB,所以我创建了union类型{ {1}}。该方法做了一些常见的事情,然后是一些基于tItem的特定事情(循环遍历item.typesomeKeyValPairCollection。Typescript吓坏了,抛出了六个分配错误,ex {{1 (没有狗屎)。

该方法大致如下:

someOtherKeyValPairCollection

如何处理Property 'someKeyValPairCollection' is missing in type Item

1 个答案:

答案 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;
}

修改

添加了一个简单的替代方法,可以捕获其余的枚举值,而无需为每个枚举值定义单独的类型或必须单独列出它们。