Saya telah mendefinisikan enum berikut dalam TypeScript:
enum Color{
Red, Green
}
Sekarang dalam fungsi saya, saya menerima warna sebagai string. Saya sudah mencoba kode berikut:
var green= "Green";
var color : Color = <Color>green; // Error: can't convert string to enum
Bagaimana saya bisa mengubah nilai itu menjadi enum?
typescript
Amitabh
sumber
sumber
--noImplicitAny
(dalam VS tidak dicentang "Izinkan jenis 'apa pun' tersirat"). Ini menghasilkanerror TS7017: Index signature of object type implicitly has an 'any' type.
Bagi saya ini bekerja:var color: Color = (<any>Color)[green];
(diuji dengan versi 1.4)var color : Color = Color[green as keyof typeof Color];
Pada Keyscript 2.1 kunci string dalam enums sangat diketik.
keyof typeof
digunakan untuk mendapatkan info tentang kunci string yang tersedia ( 1 ):https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
sumber
let s = "Green"; let typedColor = <keyof typeof Color> s;
let
denganconst
akan bekerja tanpa casting. Contoh yang diperbarui untuk memperjelas ini. Terima kasih @SergeyTtypedColorString = Color["Black"];
sekarang kembalierror TS7015: Element implicitly has an 'any' type because index expression is not of type 'number'
const color: Color = Color[colorString as keyof typeof Color];
Jika Anda yakin string input memiliki kecocokan persis dengan Color enum, gunakan:
Dalam hal string input mungkin tidak cocok dengan Enum, gunakan:
Tempat bermain
Jika kita tidak melakukan cast
enum
untuk<any>
mengetik maka TypeScript akan menampilkan kesalahan:Ini berarti bahwa secara default tipe TypeScript Enum bekerja dengan indeks angka, yaitu
let c = Color[0]
, tetapi tidak dengan indeks string sepertilet c = Color["string"]
. Ini adalah batasan yang diketahui oleh tim Microsoft untuk masalah indeks string objek yang lebih umum .sumber
typeof '0'
seharusnyastring
Contoh ini berfungsi dengan
--noImplicitAny
di TypeScriptSumber:
https://github.com/Microsoft/TypeScript/issues/13775#issuecomment-276381229 https://www.typescriptlang.org/docs/handbook/advanced-types.html#index-types
sumber
Catatan ini terkait dengan jawaban basarat , bukan pertanyaan aslinya.
Saya punya masalah aneh di proyek saya sendiri di mana kompiler memberikan kesalahan kira-kira setara dengan "tidak dapat mengubah string ke Warna" menggunakan setara dengan kode ini:
Saya menemukan bahwa menyimpulkan tipe kompiler semakin membingungkan dan berpikir bahwa
colorId
itu adalah nilai enum dan bukan ID. Untuk memperbaiki masalah saya harus melemparkan ID sebagai string:Saya tidak yakin apa yang menyebabkan masalah ini tetapi saya akan meninggalkan catatan ini di sini kalau-kalau ada yang mengalami masalah yang sama saya lakukan.
sumber
Saya membuatnya bekerja menggunakan kode berikut.
sumber
Jika Anda memberikan nilai string ke enum Anda, gips lurus berfungsi dengan baik.
sumber
const colorEnum = "Blue" as Color
tidak akan salah, dan Anda akan berpikir bahwacolorEnum
itu OK. Tetapi jika Anda keconsole.log
sana, Anda akan melihat "Biru". Jawaban Artru bagus, karenacolorEnum
akanundefined
- dan Anda kemudian dapat memeriksanya secara khusus.Mengingat Anda menggunakan naskah: Banyak solusi di atas mungkin tidak berfungsi atau terlalu rumit.
Situasi : String tidak sama dengan nilai enum (casing berbeda)
Cukup gunakan:
sumber
Saya juga mengalami kesalahan kompiler yang sama. Hanya sedikit variasi dari pendekatan Sly_cardinal.
sumber
myProp.color = Color[<string><any>myProp.color]
CheersJika kompiler TypeScript tahu bahwa tipe variabel adalah string maka ini berfungsi:
Kalau tidak, Anda harus secara eksplisit mengonversinya menjadi string (untuk menghindari peringatan kompiler):
Saat runtime kedua solusi akan bekerja.
sumber
<string>colorName
saja"" + colorName
?Ada banyak informasi campuran dalam pertanyaan ini, jadi mari kita bahas seluruh implementasi untuk TypeScript 2.x + di Panduan Nick untuk Menggunakan Enums dalam Model dengan TypeScript .
Panduan ini untuk: orang yang membuat kode sisi-klien yang menelan serangkaian string yang diketahui dari server yang akan dimodelkan dengan mudah sebagai Enum di sisi klien.
Tentukan enum
Mari kita mulai dengan enum. Seharusnya terlihat seperti ini:
Dua hal yang perlu diperhatikan di sini:
Kami secara eksplisit mendeklarasikan ini sebagai kasus enum yang didukung string yang memungkinkan kami untuk membuat instance dengan string, bukan beberapa angka yang tidak terkait lainnya.
Kami telah menambahkan sebuah opsi yang mungkin atau mungkin tidak ada pada model server kami:
UNKNOWN
. Ini dapat ditangani seolah-undefined
olah Anda lebih suka, tetapi saya ingin menghindari| undefined
jenis bila memungkinkan untuk menyederhanakan penanganan.Hal terbaik dari memiliki
UNKNOWN
kasing adalah Anda dapat benar-benar jelas tentangnya dalam kode dan membuat gaya untuk kasing enum yang tidak diketahui berwarna merah terang dan berkilau sehingga Anda tahu Anda tidak menangani sesuatu dengan benar.Pecahkan enum
Anda mungkin menggunakan enum ini tertanam dalam model lain, atau sendirian, tetapi Anda harus mengurai enum yang diketik string-y dari JSON atau XML (ha) ke rekan Anda yang sangat diketik. Ketika disematkan dalam model lain, parser ini hidup di konstruktor kelas.
Jika enum diurai dengan benar, itu akan berakhir sebagai jenis yang tepat. Jika tidak, itu akan terjadi
undefined
dan Anda dapat mencegatnya dan mengembalikanUNKNOWN
kasing Anda . Jika Anda lebih suka menggunakanundefined
sebagai kasing yang tidak dikenal, Anda bisa mengembalikan hasil apa pun dari percobaan enum parsing.Dari sana, itu hanya masalah menggunakan fungsi parse dan menggunakan variabel yang baru Anda ketikkan.
sumber
IssueType["REPS"]="REPS"
. Jika Anda mendefinisikan enum Anda sedikit berbeda, katakanlah,REPS="reps"
ini akan menghasilkanIssueType["REPS"]="reps"
yang ...IssueType.UNKNOWN
karena tidak ada kuncireps
di enum Anda. Sayang sekali, saya masih tidak menemukan solusi untuk ini karena string saya mengandung tanda hubung yang membuat mereka tidak dapat digunakan sebagai kunci.Saya mencari jawaban yang bisa mendapatkan
enum
daristring
, tetapi dalam kasus saya, nilai enum memiliki pasangan nilai string yang berbeda. OP memiliki enum sederhana untukColor
, tetapi saya memiliki sesuatu yang berbeda:Ketika Anda mencoba menyelesaikan
Gender.CantTell
dengan"Can't tell"
string, itu kembaliundefined
dengan jawaban yang asli.Jawaban lain
Pada dasarnya, saya datang dengan jawaban lain, sangat terinspirasi oleh jawaban ini :
Catatan
filter
, dengan asumsi klien melewati string yang valid dari enum. Jika tidak demikian,undefined
akan dikembalikan.enumObj
untukany
, karena dengan naskah 3.0+ (saat ini menggunakan naskah 3,5), yangenumObj
diselesaikan sebagaiunknown
.Contoh Penggunaan
Catatan: Dan, seperti yang ditunjukkan seseorang dalam komentar, saya juga ingin menggunakan
noImplicitAny
.Versi terbaru
Tidak ada cor ke
any
dan pengetikan yang tepat.Juga, versi yang diperbarui memiliki cara yang lebih mudah untuk menyebutnya dan lebih mudah dibaca:
sumber
Saya perlu tahu cara mengulang nilai enum (sedang menguji banyak permutasi dari beberapa enum) dan saya menemukan ini berfungsi dengan baik:
Sumber: https://blog.mikeski.net/development/javascript/typescript-enums-to-from-string/
sumber
each
untuk menguji setiap kasus enum dengan hanya satu metodeEnum
Penggunaan sampel
Abaikan parse peka huruf besar-kecil
sumber
return enumType[property];
kasus ketika item enum Anda terlihat sepertiSkills = "anyvalue"
Enum yang dibuat dengan cara Anda dikompilasi menjadi objek yang menyimpan pemetaan maju
(name -> value)
dan mundur(value -> name)
. Seperti yang bisa kita amati dari tangkapan layar chrome devtools ini:Berikut adalah contoh cara kerja pemetaan ganda dan cara saling melemparkan:
sumber
Coba ini
Itu berfungsi dengan baik untuk versi 3.5.3
sumber
Jika Anda menggunakan ruang nama untuk memperluas fungsionalitas enum Anda, maka Anda juga dapat melakukan sesuatu seperti
dan gunakan seperti ini
sumber
variasi lain bisa
sumber