2017-07-03 15 views
6

Dize enumlarını yazı tipinde kullanmak istedim, ancak tersine eşleme için bir destek göremiyorum. Böyle Bir enum vardır:Dize Enümleri için Ters Eşleme

enum Mode { 
    Silent = "Silent", 
    Normal = "Normal", 
    Deleted = "Deleted" 
} 

ve ben bu gibi kullanmak gerekir:

let modeStr: string; 
let mode: Mode = Mode[modeStr]; 

ve evet ben modeStr dizede orada ne olduğunu bilmiyorum ve bunu çözümlenen gerek dize enum tanımında sunulmamışsa, enum değerine veya çalışma zamanında ayrıştırma başarısız olur. Bunu olabildiğince nasıl düzgün yapabilirim? sayesinde önceden

+1

Olası çoğaltılabilir [Dizgede dize değerleri içeren bir enum oluşturma] (https://stackoverflow.com/questions/15490560/create-an-enum-with-string-values-in-typescript) –

+0

@ ponury-kostek Teknik olarak, bu soru ters bir haritalama sorunuyla ilgilenmez. Olsa bile, muhtemelen altta gizlenmiş birçok cevaplardan birinde oturur ve çözümü bulmak çok zor hale getirir. Daha iyi bir kopya yoksa, bunu devam ettirelim diyorum. –

cevap

5

Biz Mode bir tipi ve aynı tip bir değer olması yapabilirsiniz.

type Mode = string; 
let Mode = { 
    Silent: "Silent", 
    Normal: "Normal", 
    Deleted: "Deleted" 
} 

let modeStr: string = "Silent"; 
let mode: Mode; 

mode = Mode[modeStr]; // Silent 
mode = Mode.Normal; // Normal 
mode = "Deleted"; // Deleted 
mode = Mode["unknown"]; // undefined 
mode = "invalid"; // "invalid" 

daha sıkı sürümü: this answer olarak

type Mode = "Silent" | "Normal" | "Deleted"; 
const Mode = { 
    get Silent(): Mode { return "Silent"; }, 
    get Normal(): Mode { return "Normal"; }, 
    get Deleted(): Mode { return "Deleted"; } 
} 

let modeStr: string = "Silent"; 
let mode: Mode; 

mode = Mode[modeStr]; // Silent 
mode = Mode.Normal; // Normal 
mode = "Deleted"; // Deleted 
mode = Mode["unknown"]; // undefined 
//mode = "invalid"; // Error 

Dize Enum:

enum Mode { 
    Silent = <any>"Silent", 
    Normal = <any>"Normal", 
    Deleted = <any>"Deleted" 
} 

let modeStr: string = "Silent"; 
let mode: Mode; 

mode = Mode[modeStr]; // Silent 
mode = Mode.Normal; // Normal 
//mode = "Deleted"; // Error 
mode = Mode["unknown"]; // undefined 
+0

Teşekkürler ... Yine de yazı tipinde uygulanabilirdi. –

+0

tslint, Enum örneğinde bir hata verir: * Dizin ifadesi 'sayı' türünde olmadığından * Öğenin 'herhangi bir' türünün örtülü olduğu vardır *. Sorun şu ki, TS dizgisi Enums, ters eşlemeli olamaz, bkz. String-Enum örneğindeki yorumu https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-4 .html - Bu, String-Enum'un tanıtıldığı TS 2.4 için geçerli gibi görünüyor ancak aynı zamanda TS 2.6.2'de hata alıyorum – masi

+0

@masi 2.4'ten beri, TS dizesi enums için destek sağlıyor. 'lu yayın. – Rodris

1

Eğer Proxies'i kullanarak Tamam iseniz, daha genel & kompakt versiyonu yapılmış:

stringEnum.ts

export type StringEnum<T extends string> = {[K in T]: K} 
const proxy = new Proxy({}, { 
    get(target, property) { 
    return property; 
    } 
}) 
export default function stringEnum<T extends string>(): StringEnum<T> { 
    return proxy as StringEnum<T>; 
} 

Kullanımı: Böylece

let reverseMode = new Map<string, Mode>(); 
Object.keys(Mode).forEach((mode: Mode) => { 
    const modeValue: string = Mode[<any>mode]; 
    reverseMode.set(modeValue, mode); 
}); 

Eğer let mode: Mode = reverseMode.get('Silent');

Avantajları yapabilirsiniz: hiç gerek ben bugüne kadar bulunmuş

import stringEnum from './stringEnum'; 
type Mode = "Silent" | "Normal" | "Deleted"; 
const Mode = stringEnum<Mode>(); 
0

en temiz yolu ikincil harita yapmaktır değerleri tekrarlayın, enum numaralandırmanın bir yolunu sağlar, TSLint'i mutlu eder ...

Düzenleme: Aslen Mode[mode] yazıyor ama TS bu satırda TS7015 hatasını atabilir, bu yüzden ekledim.