2017-11-30 6 views
0

enthalten ist Ich habe ein Problem mit definierten Typen und überprüfen, ob ein Wert in diesem Typ enthalten ist.Typescript: Überprüfen, ob der Wert in Typ

Hier ist mein Beispiel:

das sind die Typen sind:

export type Key = 'features' | 'special'; 

export type TabTypes = 'info' | 'features' | 'special' | 'stars'; 

, wenn der Benutzer eine Registerkarte ändert, ist es einen String-Wert von Typ TabTypes sendet.

Gibt es eine Typoskript Möglichkeit zu prüfen, ob ein gesendeter Wert mit einem Typ einem Wert von einem anderen Typ entsprechen kann?

Antwort

0

Sie können es mit typeof überprüfen:

console.log(typeof this.key === event); // return true or false 
+0

Der Typ String sein wird, das ist nicht das Problem –

0

Wenn Sie überprüfen, dass die Saiten die genauen Saiten der Art sind, oder wenn Sie prüfen, ob sie nicht die Saiten, die nicht im Key Typ sind es funktioniert:

export type Key = 'features' | 'special'; 

export type TabTypes = 'info' | 'features' | 'special' | 'stars'; 
function activeTabChanged(event: TabTypes) { 
    var activeTab: TabTypes = event; 
    if(event != 'info' && event != 'stars') { 
     let key: Key = event; 
    } 
    // OR 
    if(event == 'features' || event == 'special') { 
     let key: Key = event; 
    } 
} 

bearbeiten

Das Problem mit dem type d Definition ist, dass es zur Kompilierungszeit gelöscht wird, so dass es zur Laufzeit keine Möglichkeit gibt, die Überprüfung durchzuführen. Ein ausführlicher Weise die Enum Basis auf dieser page deklarieren und eine Schutzvorrichtung kann acieve die Wirkung helfen:

/** Utility function to create a K:V from a list of strings */ 
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} { 
    return o.reduce((res, key) => { 
    res[key] = key; 
    return res; 
    }, Object.create(null)); 
} 
const Key = strEnum([ 
    'features', 
    'special', 
]) 
type Key = keyof typeof Key; 
function isKey(key: string) : key is Key { 
    return Key[key] !== undefined; 
} 

export type TabTypes = 'info' | 'features' | 'special' | 'stars'; 


function activeTabChanged(event: TabTypes) { 
    var activeTab: TabTypes = event; 
    if(isKey(event)) { 
     let key: Key = event; 
    } 
} 

Dieses Beispiel ist es wert, wenn die Aufzählungen groß sind, ansonsten wird die erste Version könnte genauso gut funktionieren.

+0

ich will nicht genau gegen die Saiten testen. Ich meine, wenn ich muss, werde ich es tun, aber ich dachte, dass es eine elegantere Art und Weise mit den Funktionen von Typoskript gibt. Ich meine, ich habe den Typ Key bereits beschrieben und dachte, dass ich die Werte in einer if-Klausel vielleicht nicht fest codieren muss. – sanyooh

+0

@sanyooh hat eine neue Version hinzugefügt, die etwas ausführlicher ist, aber die Duplizierung der Strings entfernt. –

0

Sie könnten eine Zeichenfolge enum verwenden.

export enum Keys = { 
    Features = 'features', 
    Special = 'special', 
} 

// Compare it 
if (currentKey === Keys.Special) { console.log('Special key is set'); } 

Um zu überprüfen, ob Ihr Wert in dem vordefinierten Enum überhaupt definiert ist, können Sie tun:

if (currentKey in Keys) { console.log('valid key'); }