У меня есть несколько интерфейсов, которые расширяются от базы:
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
, поэтому я создал тип объединения tItem
. Метод делает некоторые общие вещи, а затем некоторые определенные вещи, основанные на item.type
(циклически проходя либо someKeyValPairCollection
, либо someOtherKeyValPairCollection
. Typescript сходит с ума, выбрасывая полдюжины ошибок присваивания, например Property 'someKeyValPairCollection' is missing in type Item
(без дерьма).
Метод выглядит примерно так:
processItem(item: tItem): boolean {
const isValid: boolean = checkValidity(item);
if (!isValid) return false;
_.each(someCommonKeyValPairCollection, () => { /* do some common stuff */ });
// if (typeof item.someKeyValPairCollection !== 'undefined') // tried first, doesn't like
if (item.type === eItemType.a) processA(item.someKeyValPairCollection);
return true;
}
Как справиться с if (item.type === eItemType.a) // do some special stuff
?