2016-03-01 3 views
7

Что такое правильный способ справиться с ситуацией, когда у вас есть два интерфейса, которые достаточно близки, что вы хотите, чтобы запустить их через тот же кусок логики:Типы Машинопись Союза: Работа с интерфейсами

interface DescriptionItem { 
    Description: string; 
    Code: string; 
} 
interface NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    var desc = (<DescriptionItem>i).Description || (<NamedItem>i).Name; 

    return i.Code + ' - ' + desc; 
} 

Это работает; однако, мой вопрос заключается в улучшении линии var desc = .... Есть ли у меня выше наилучшего варианта? Или есть лучший способ справиться с этой ситуацией в TypScript?

+0

Я бы сказал так, как вы сделали это выглядит нормально. Однако сам вопрос в основном основан на мнениях, и я буду голосовать, чтобы закрыть его на этой основе. :) – toskv

ответ

5

TypeScript interfaces существует только во время компиляции, поэтому для тестирования типов интерфейсов во время выполнения не так много можно проверить. Код, указанный вами в вашем вопросе, имеет смысл и, вероятно, ваш лучший вариант.

Однако, если у вас есть возможность изменить ваш interfaces к classes, вы можете использовать защитное типа машинописи, чтобы сделать более элегантные проверки типов:

class DescriptionItem { 
    Description: string; 
    Code: string; 
} 
class NamedItem { 
    Name: string; 
    Code: string; 
} 

function MyLogic(i: DescriptionItem | NamedItem) { 
    let desc: string; 
    if (i instanceof DescriptionItem) { 
     desc = i.Description; 
    } else { 
     desc = i.Name; 
    } 

    return i.Code + ' - ' + desc; 
} 
+0

Почему вы не можете проверить, существует ли 'i.Name' и дифференцировать типы на основе этого? – jocull

+0

@jocull Что делать, если объект был экземпляром 'NamedItem', но его' Name' был 'undefined'? –

+0

Если в нем отсутствуют необязательные данные, действительно ли это экземпляр «NamedItem»? – jocull

Смежные вопросы