Kode berikut dapat digunakan untuk membuat enum
dalam TypeScript:
enum e {
hello = 1,
world = 2
};
Dan nilai-nilai dapat diakses oleh:
e.hello;
e.world;
Bagaimana cara membuat nilai enum
dengan string?
enum e {
hello = "hello", // error: cannot convert string to e
world = "world" // error
};
typescript
Telapak tangan
sumber
sumber
Jawaban:
TypeScript 2.4
Sekarang memiliki string enum sehingga kode Anda hanya berfungsi:
🌹
TypeScript 1.8
Sejak TypeScript 1.8 Anda dapat menggunakan tipe string literal untuk memberikan pengalaman yang dapat diandalkan dan aman untuk nilai string yang diberi nama (yang sebagian digunakan untuk enum).
Lebih lanjut: https://www.typescriptlang.org/docs/handbook/advanced-types.html#string-literal-types
Dukungan Warisan
Enum dalam TypeScript berbasis angka.
Anda dapat menggunakan kelas dengan anggota statis:
Anda bisa menjadi jelas juga:
Pembaruan: Berdasarkan pada persyaratan untuk dapat melakukan sesuatu seperti
var test:E = E.hello;
yang berikut memenuhi:sumber
toString(): string { return this.value; }
toString
mengembalikan string karena kembalithis.value
danvalue
bertipe string. Jadi Anda tidak dapat melakukanvar x:number = E.hello.toString();
dan jika Anda melakukannyavar x = E.hello.toString();
x disimpulkanstring
sebagai tipe juga :)get()
metode denganreturn this.value
? Dengan begitu ia akan mengembalikan nilai string kapan pun diakses dan tidak hanya saat mengonversitoString()
.value
anggota pada semua jenis dan memperlakukan mereka sebagai jenis yang sebanding. Anda bisa menjadikanvalue
anggota sebagai pribadi. Dengan cara ini kompiler tidak akan melihatnya dan tidak akan mencoba menerapkan pengetikan struktural.Dalam versi terbaru (1.0RC) dari TypeScript, Anda dapat menggunakan enum seperti ini:
Perbarui 1
Untuk mendapatkan nilai angka anggota enum dari nilai string, Anda dapat menggunakan ini:
Perbarui 2
Di TypeScript 2.4 terbaru, diperkenalkan string enum, seperti ini:
Untuk info lebih lanjut tentang TypeScript 2.4, baca blog di MSDN .
sumber
States[str]
tidak berfungsi saat ini.Type 'string' is not assignable to type 'States'
States[str as any]
untuk melakukan dalam versi saat ini (2.x) dari naskah.TypeScript 2.4+
Anda sekarang dapat menetapkan nilai string secara langsung ke anggota enum:
Lihat # 15486 untuk informasi lebih lanjut.
TypeScript 1.8+
Di TypeScript 1.8+, Anda bisa membuat tipe string literal untuk menentukan tipe dan objek dengan nama yang sama untuk daftar nilai. Ini meniru perilaku string enum yang diharapkan.
Ini sebuah contoh:
Yang akan bekerja seperti string enum:
Pastikan untuk mengetik semua string di objek! Jika Anda tidak melakukannya, pada contoh pertama di atas variabel tidak akan diketik secara implisit
MyStringEnum
.sumber
Dalam TypeScript 0.9.0.1, meskipun terjadi kesalahan kompiler, kompiler masih dapat mengkompilasi file ts ke file js. Kode berfungsi seperti yang kami harapkan dan Visual Studio 2012 dapat mendukung penyelesaian kode otomatis.
Perbarui:
Dalam sintaksis, TypeScript tidak memungkinkan kita membuat enum dengan nilai string, tetapi kita dapat meretas kompiler: p
Tempat bermain
sumber
case Link.LEARN:
Akan mendapatkanCannot convert 'Link.LEARN' to 'string'
galat build. Casting tidak akan bekerja.TypeScript 2.1 +
Jenis pencarian , diperkenalkan dalam TypeScript 2.1 memungkinkan pola lain untuk mensimulasikan string enum:
TypeScript 2.4 +
Dengan versi 2.4, TypeScript memperkenalkan dukungan asli untuk string enum, sehingga solusi di atas tidak diperlukan. Dari dokumen TS:
sumber
Colors["RED"]
tidak akan berfungsi. Tahu cara mengatasi ini (diperlukan untuk konversi JSON).Mengapa tidak menggunakan cara asli untuk mengakses string enum.
sumber
enum Why { Because = "You Can't", Always = "Do Things That Way." }
;)Anda dapat menggunakan string enum di TypeScript terbaru:
Sumber: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
UPDATE - 2016
Cara yang sedikit lebih kuat untuk membuat serangkaian string yang saya gunakan untuk Bereaksi hari ini adalah seperti ini:
sumber
<string>e.hello
memicu kesalahan.e.hello
masih dianggap sebagai angka oleh kompiler.<number>e.hello
tidak bekerja. Apakah ada cara untuk mengatasi ini? Yang bisa saya pikirkan adalah<string><any>e.hello
.enum Test { a = <any>"b", b = <any>"c", c = <any>"a" }
Test.a === 'c'
<any>
itu<string>
, cukup lakukan:someStringValue == someEnumValue.toString()
Inilah solusi yang cukup bersih yang memungkinkan pewarisan, menggunakan TypeScript 2.0. Saya tidak mencoba ini pada versi sebelumnya.
Bonus: nilainya bisa berupa apa saja !
sumber
Cara hacky untuk ini adalah: -
CallStatus.ts
Utils.ts
Cara Penggunaan
sumber
Ini bekerja untuk saya:
atau
8)
Pembaruan: Tidak lama setelah memposting ini saya menemukan cara lain, tetapi lupa memposting pembaruan (namun, seseorang sudah menyebutkannya di atas):
sumber
Saya hanya mendeklarasikan antarmuka dan menggunakan variabel jenis itu mengakses enum. Menjaga antarmuka dan enum tetap sinkron sebenarnya mudah, karena TypeScript mengeluh jika ada perubahan di enum, seperti itu.
Keuntungan dari metode ini adalah tidak diperlukan pengecoran tipe untuk menggunakan enum (antarmuka) dalam berbagai situasi, dan dengan demikian lebih banyak jenis situasi yang didukung, seperti sakelar / kasing.
Menggunakan variabel, daripada enum, menghasilkan hasil yang diinginkan.
Bendera adalah kebutuhan lain bagi saya, jadi saya membuat modul NPM yang menambah contoh ini, dan termasuk tes.
https://github.com/djabraham/ts-enum-tools
sumber
export default EAbFlagEnum as IAbFlagEnum;
alih-alih mendeklarasikan ulang variabel. Saya juga menghapus<any>
gips di enum, itu berfungsi dengan baik.UPDATE: TypeScript 3.4
Anda cukup menggunakan
as const
:TypeScript 2.1
Ini juga bisa dilakukan dengan cara ini. Semoga ini bisa membantu seseorang.
sumber
Dengan transformer khusus ( https://github.com/Microsoft/TypeScript/pull/13940 ) yang tersedia dalam typescript @ next, Anda dapat membuat objek enum seperti dengan nilai string dari nilai string dari tipe literal string.
Silakan lihat paket npm saya, ts-transformer-enumerate .
Contoh penggunaan:
sumber
TypeScript <2.4
dari https://basarat.gitbooks.io/typescript/docs/types/literal-types.html
Untuk tautan sumber, Anda dapat menemukan lebih banyak dan lebih mudah cara untuk mencapai tipe literal string
sumber
Ada banyak jawaban, tetapi saya tidak melihat solusi yang lengkap. Masalah dengan jawaban yang diterima, dan juga
enum { this, one }
, adalah bahwa ia menyebarkan nilai string yang kebetulan Anda gunakan melalui banyak file. Saya juga tidak terlalu suka "pembaruan", itu rumit dan tidak memanfaatkan tipe juga. Saya pikir jawaban Michael Bromley paling benar, tetapi antarmuka itu agak merepotkan dan bisa dilakukan dengan tipe.Saya menggunakan TypeScript 2.0. * Inilah yang akan saya lakukan
let greet: Greeting = Greeting.hello
Ini juga memiliki banyak jenis informasi yang lebih baik / melayang ketika menggunakan IDE yang bermanfaat. Kekurangannya adalah Anda harus menulis string dua kali, tetapi setidaknya itu hanya di dua tempat.
sumber
Jawaban @ basarat sangat bagus. Di sini disederhanakan tetapi sedikit contoh diperluas yang dapat Anda gunakan:
sumber
Menghadapi masalah ini baru-baru ini dengan TypeScript 1.0.1, dan dipecahkan dengan cara ini:
sumber
Saya pikir Anda harus mencoba dengan ini, dalam hal ini nilai variabel tidak akan berubah dan berfungsi seperti enum, menggunakan seperti kelas juga berfungsi satu-satunya kelemahan adalah dengan kesalahan Anda dapat mengubah nilai variabel statis dan itulah yang kami tidak ingin di enums.
sumber
sumber
sumber
Sedikit js-hacky tetapi berfungsi:
e[String(e.hello)]
sumber
Jika yang Anda inginkan terutama debug mudah (dengan cukup ketik centang) dan tidak perlu menentukan nilai khusus untuk enum, inilah yang saya lakukan:
Jika Anda ingin mendukung kode lama / penyimpanan data, Anda dapat menyimpan kunci numerik.
Dengan cara ini, Anda dapat menghindari mengetik nilai dua kali.
sumber
Sangat, sangat, sangat sederhana dengan string (TypeScript 2.4)
sumber
Saya telah mencoba dalam TypeScript 1.5 seperti di bawah ini dan itu berhasil untuk saya
sumber
saya sedang mencari cara untuk mengimplementasikan deskripsi di encript skrip (v2.5) dan pola ini bekerja untuk saya:
...
sumber
TypeScript 0.9.0.1
TypeScript Playground
sumber
Cannot convert 'string' to 'e'.
.