Bagaimana cara membuat enum like type di TypeScript?

121

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?

eNepper
sumber
3
Definisi Google Maps v3 sekarang sudah lengkap dan dapat ditemukan di Github dan NuGet
eNepper

Jawaban:

141

TypeScript 0.9+ memiliki spesifikasi untuk enum:

enum AnimationType {
    BOUNCE,
    DROP,
}

Koma terakhir adalah opsional.

Steve Lucco
sumber
11
Saya akan menyarankan agar tidak menggunakan enumkonstruksi pada tahap ini karena tim TypeScript telah membuatnya cukup jelas itu akan berubah - jadi itu akan rusak.
Fenton
1
Harap nyamankan diri Anda dengan alat pengeditan, misalnya dengan kode yang Anda tambahkan ke jawaban Anda. Saya mengubahnya dalam jawaban Anda untuk, silakan lihat. Juga mohon tinggalkan beberapa referensi jika ada pembahasan terkait tentang fitur bahasa tersebut.
hakre
enum Animation {BOUNCE = 1, DROP}, karena itulah cara Maps API mendefinisikannya.
dchest
Enum dan konvensi penamaan anggotanya sama seperti di c #. (keduanya dari Microsoft). Ini PascalCase. Bukan UPPER_CASE.
Dominik
66

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;
Fenton
sumber
3
Ini sekarang harus menjadi jawaban yang diterima karena masih bekerja di RC dan oleh karena itu tidak mungkin merusak versi TS yang akan datang.
Adrian Grigore
24

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();
Jeroen
sumber
14

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};


}
done_merson
sumber
2
Bagaimana Anda mengakses strdan idmenggunakannya?
kba
1
EnumyObjects.BOUNCE.str akan mengakses nilainya.
done_merson
2
Masalah dengan desain ini adalah bahwa semua objek dapat berubah, yang dapat menyebabkan masalah: goo.gl/CT4Ip
Fenton
Akan abstract classlebih tepat untuk mencegah pembuatan instance karena TypeScript tidak memiliki gagasan tentang static class?
bercanda
10

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!
Arthur
sumber
1
TypeScript 2.4 menyertakan dukungan untuk tipe literal string dalam enum. Lihat stackoverflow.com/questions/15490560/... dan blogs.msdn.microsoft.com/typescript/2017/06/27/...
iX3
1

Enum dalam naskah ketikan:

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.

Membuat 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).

Menggunakan enum:

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:

  1. Kita perlu berpikir lebih keras, pertama-tama kita perlu menerjemahkan nomor tersebut ke entitas sebelum kita dapat bernalar tentang kode kita.
  2. Jika kita meninjau kode kita setelah sekian lama, atau programmer lain meninjau kode kita, mereka belum tentu tahu apa yang dimaksud dengan angka-angka ini.
Willem van der Veen
sumber