2016-03-01 10 views
7

Jaki jest właściwy sposób obsłużyć sytuację, gdzie masz dwa interfejsy, które są na tyle podobne, że chcesz je uruchomić za pośrednictwem tego samego kawałka logiki:Rodzaje Typescript Union: Radzenie sobie z interfejsami

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

To działa; jednak moje pytanie dotyczy ulepszenia linii var desc = .... Czy to, co mam powyżej najlepszej opcji? Czy istnieje lepszy sposób na poradzenie sobie z tą sytuacją w Maszynopisie?

+0

Powiedziałbym, że sposób, w jaki zrobił to wygląda dobrze. Jednak samo pytanie jest oparte przede wszystkim na opiniach i będę głosować, aby zamknąć je na tej podstawie. :) – toskv

Odpowiedz

5

TypeScript interfaces istnieje tylko podczas kompilacji, więc niewiele można zrobić, aby przetestować typy interfejsów w czasie wykonywania. Kod podany w pytaniu ma sens i jest prawdopodobnie najlepszą opcją.

Jednakże, jeśli masz możliwość, aby zmienić interfaces do classes, można użyć osłony typu maszynopis, aby zrobić bardziej elegancki sprawdzanie typu:

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

Dlaczego nie możesz sprawdzić czy 'i.Name' istnieje i odróżnić typy na podstawie tego? – jocull

+0

@ jocull Co jeśli obiekt był instancją 'NamedItem', ale jego' Name' było 'undefined'? –

+0

Jeśli brakuje danych nieobowiązkowych, czy to naprawdę jest instancja 'NamedItem'? – jocull

Powiązane problemy