2016-03-01 10 views
7

Was ist der richtige Weg ist, eine Situation zu handhaben, wo Sie zwei Schnittstellen haben, die ähnlich genug sind, dass man sie durch das gleiche Stück Logik ausgeführt werden soll:Typoskript Union Arten: Der Umgang mit Schnittstellen

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

Dies funktioniert; Meine Frage betrifft jedoch die Verbesserung der var desc = ... Linie. Ist das, was ich über die beste Option habe? Oder gibt es einen besseren Weg, um mit dieser Situation in Typoskript umzugehen?

+0

Ich würde sagen, so, wie Sie es taten sieht gut aus:

Wenn Sie jedoch die Flexibilität haben Ihre interfaces-classes zu ändern, können Sie Typoskript des Typs Wachen zu tun elegantere Typprüfung verwenden. Die Frage selbst ist jedoch in erster Linie meinungsbezogen, und ich werde dafür stimmen, auf dieser Grundlage zu schließen. :) – toskv

Antwort

5

TypSkript interfaces gibt es nur zur Kompilierzeit, es gibt also nicht viel zu tun, um zur Laufzeit auf Schnittstellentypen zu testen. Der Code, den Sie in Ihrer Frage angegeben haben, ist sinnvoll und wahrscheinlich die beste Option.

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

Warum können Sie nicht überprüfen, ob 'i.Name' existiert und die Typen basierend darauf unterscheiden? – jocull

+0

@jocull Was wäre, wenn das Objekt eine Instanz von 'NamedItem' wäre, aber dessen' Name' 'undefined' wäre? –

+0

Wenn nicht-optionale Daten fehlen, ist es dann wirklich eine Instanz von 'NamedItem'? – jocull

Verwandte Themen