2017-05-27 3 views
3

Ist es möglich, eine Bedingung innerhalb einer Schnittstelle Deklaration in TypeScript zu haben. Was ich suche, ist eine Art zu sagen, basierend auf dem Wert des ersten Schlüssels kann der zweite Schlüssel diese Werte sein.Javascript Bedingte Inside TypeScript-Schnittstelle

Beispiel (nicht funktioniert):

interface getSublistValue { 

    /** The internal ID of the sublist. */ 
    sublistId: 'item' | 'partners'; 

    /** The internal ID of a sublist field. */ 
    if (this.sublistId === 'item') { 
     fieldId: 'itemname' | 'quantity'; 
    } 

    if (this.sublistId === 'partners') { 
     fieldId: 'partnername' | 'location'; 
    } 
} 

Antwort

5

Nein gibt es nicht. Am besten erstellen Sie separate Schnittstellen, die die zwei unterschiedlichen Datentypen beschreiben.

Zum Beispiel:

interface SublistItem { 
    sublistId: 'item'; 
    fieldId: 'itemname' | 'quantity'; 
} 

interface SublistPartners { 
    sublistId: 'partners'; 
    fieldId: 'partnername' | 'location'; 
} 

function getData(): SublistItem | SublistPartners { 
    return (Math.random() < 0.5) 
     ? { sublistId: 'item', fieldId: 'itemname' } 
     : { sublistId: 'partners', fieldId: 'partnername' }; 
} 

const someValue = getData(); 

if (someValue.sublistId === "item") { 
    // SublistItem in here 
} 
else { 
    // SublistPartners in here 
} 
+0

Also, wenn ich diese Methode verwenden, wenn ich das 'someValue' Objekt bin Erstellung noch alle vier Optionen für' fieldId' mit der automatischen Vervollständigung ich bekommen, aber zumindest gibt es mir eine Warnung wenn die sublistId und fieldId nicht übereinstimmen (dh 'item' und 'partnername'). Die Sache, die mich erreicht, ist, dass, wenn mein 'someValue' ist 'const someValue: SublistItem | SublistPartners = { sublistId: 'partner', fieldId: 'location' }; 'dann erhalte ich eine Warnung über die Bedingung 'if (someValuelistId ===' item ') {}', die besagt, dass 'location' ist nicht "itemname" oder "quantity", das weiß ich schon, warum sollte ich diese Warnung bekommen? –

+0

@JonLamb hmmm ... die angezeigte Fehlermeldung ist nicht hilfreich. In diesem Fall weiß es, dass "sublistId" nur "Partner" ist und daher einen Fehler auslöst, wenn Sie nach "item" suchen. Wenn Sie "item" durch "partners" ersetzen, wird es funktionieren. Versuchen Sie ein Szenario, in dem Sie einen Wert von irgendwo erhalten und Sie nicht sicher sind, was die Daten sein werden. Ich habe das Beispiel aktualisiert. –