Saya sedang mengerjakan file definisi untuk Google maps API for TypeScript.
Dan saya perlu mendefinisikan enum like type mis. google.maps.Animationyang berisi dua properti: BOUNCEdan DROP.
Bagaimana ini harus dilakukan di TypeScript?
Saya sedang mengerjakan file definisi untuk Google maps API for TypeScript.
Dan saya perlu mendefinisikan enum like type mis. google.maps.Animationyang berisi dua properti: BOUNCEdan DROP.
Bagaimana ini harus dilakukan di TypeScript?
Jawaban:
TypeScript 0.9+ memiliki spesifikasi untuk enum:
enum AnimationType {
BOUNCE,
DROP,
}
Koma terakhir adalah opsional.
enumkonstruksi pada tahap ini karena tim TypeScript telah membuatnya cukup jelas itu akan berubah - jadi itu akan rusak.
Mulai TypeScript 0.9 (saat ini rilis alfa), Anda dapat menggunakan definisi enum seperti ini:
enum TShirtSize {
Small,
Medium,
Large
}
var mySize = TShirtSize.Large;
Secara default, pencacahan ini akan ditetapkan masing-masing 0, 1 dan 2. Jika Anda ingin menyetel angka-angka ini secara eksplisit, Anda dapat melakukannya sebagai bagian dari deklarasi enum.
Daftar 6.2 Pencacahan dengan anggota eksplisit
enum TShirtSize {
Small = 3,
Medium = 5,
Large = 8
}
var mySize = TShirtSize.Large;
Kedua contoh ini diangkat langsung dari TypeScript untuk Pemrogram JavaScript .
Perhatikan bahwa ini berbeda dengan spesifikasi 0.8. Spesifikasi 0.8 tampak seperti ini - tetapi itu ditandai sebagai eksperimental dan kemungkinan akan berubah, jadi Anda harus memperbarui kode lama apa pun:
Disclaimer - contoh 0.8 ini akan rusak di versi compiler TypeScript yang lebih baru.
enum TShirtSize {
Small: 3,
Medium: 5,
Large: 8
}
var mySize = TShirtSize.Large;
Ini sekarang menjadi bagian dari bahasa. Lihat TypeScriptLang.org> Basic Type> enum untuk dokumentasi tentang ini. Kutipan dari dokumentasi tentang cara menggunakan enum ini:
enum Color {Red, Green, Blue};
var c: Color = Color.Green;
Atau dengan nomor dukungan manual:
enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;
Anda juga dapat kembali ke nama enum dengan menggunakan misalnya Color[2].
Berikut adalah contoh bagaimana semua ini berjalan bersama:
module myModule {
export enum Color {Red, Green, Blue};
export class MyClass {
myColor: Color;
constructor() {
console.log(this.myColor);
this.myColor = Color.Blue;
console.log(this.myColor);
console.log(Color[this.myColor]);
}
}
}
var foo = new myModule.MyClass();
Ini akan mencatat:
undefined 2 Blue
Karena, pada saat penulisan ini, Typecript Playground akan menghasilkan kode ini:
var myModule;
(function (myModule) {
(function (Color) {
Color[Color["Red"] = 0] = "Red";
Color[Color["Green"] = 1] = "Green";
Color[Color["Blue"] = 2] = "Blue";
})(myModule.Color || (myModule.Color = {}));
var Color = myModule.Color;
;
var MyClass = (function () {
function MyClass() {
console.log(this.myColor);
this.myColor = Color.Blue;
console.log(this.myColor);
console.log(Color[this.myColor]);
}
return MyClass;
})();
myModule.MyClass = MyClass;
})(myModule || (myModule = {}));
var foo = new myModule.MyClass();
Hanya catatan lain bahwa Anda dapat enum id / string dengan yang berikut:
class EnumyObjects{
public static BOUNCE={str:"Bounce",id:1};
public static DROP={str:"Drop",id:2};
public static FALL={str:"Fall",id:3};
}
strdan idmenggunakannya?
abstract classlebih tepat untuk mencegah pembuatan instance karena TypeScript tidak memiliki gagasan tentang static class?
Pembaruan :
Seperti dicatat oleh @ iX3, Typecript 2.4 memiliki dukungan untuk string enum.
Lihat: Membuat enum dengan nilai string di Skrip Ketik
Jawaban asli:
Untuk nilai anggota String, TypeScript hanya mengizinkan angka sebagai nilai anggota enum. Tetapi ada beberapa solusi / peretasan yang dapat Anda terapkan;
Solusi 1:
disalin dari: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
Ada solusi sederhana: Transmisikan string literal ke sembarang sebelum menetapkan:
export enum Language {
English = <any>"English",
German = <any>"German",
French = <any>"French",
Italian = <any>"Italian"
}
solusi 2:
disalin dari: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html
Anda dapat menggunakan string literal sebagai tipe. Sebagai contoh:
let foo: 'Hello';
Di sini kami telah membuat variabel bernama foo yang hanya akan memungkinkan nilai literal 'Hello' untuk ditugaskan padanya. Ini ditunjukkan di bawah ini:
let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"
Mereka sendiri tidak terlalu berguna tetapi dapat digabungkan dalam sebuah tipe gabungan untuk membuat abstraksi yang kuat (dan berguna) misalnya:
type CardinalDirection =
"North"
| "East"
| "South"
| "West";
function move(distance: number, direction: CardinalDirection) {
// ...
}
move(1,"North"); // Okay
move(1,"Nurth"); // Error!
Enum dimasukkan ke dalam bahasa skrip untuk mendefinisikan satu set konstanta bernama. Menggunakan enum bisa membuat hidup kita lebih mudah. Alasannya adalah karena konstanta ini seringkali lebih mudah dibaca daripada nilai yang diwakili oleh enum.
enum Direction {
Up = 1,
Down,
Left,
Right,
}
Contoh dari dokumen ketikan ini menjelaskan dengan sangat baik bagaimana enum bekerja. Perhatikan bahwa nilai enum pertama kita (Up) diinisialisasi dengan 1. Semua anggota enum bilangan berikut kemudian secara otomatis bertambah dari nilai ini (yaitu Down = 2, Left = 3, Right = 4). Jika kita tidak menginisialisasi nilai pertama dengan 1 enum akan dimulai dari 0 dan kemudian kenaikan otomatis (yaitu Bawah = 1, Kiri = 2, Kanan = 3).
Kita dapat mengakses nilai enum dengan cara berikut:
Direction.Up; // first the enum name, then the dot operator followed by the enum value
Direction.Down;
Perhatikan bahwa cara ini kami jauh lebih deskriptif dalam cara kami menulis kode kami. Enum pada dasarnya mencegah kita untuk menggunakan bilangan ajaib (bilangan yang mewakili suatu entitas karena pemrogram telah memberikan arti kepadanya dalam konteks tertentu). Angka ajaib itu buruk karena alasan berikut: