TypeScript'te tür listesi gibi nasıl oluşturulur?


121

TypeScript için Google maps API'sine yönelik bir tanım dosyası üzerinde çalışıyorum.

Ve örneğin bir numaralandırma türü tanımlamam gerekiyor. google.maps.Animationiki özellik içeren: BOUNCEve DROP.

Bu, TypeScript'te nasıl yapılmalıdır?


3
Google Maps v3 tanımı artık tamamlandı ve bulunabilir Github ve Nuget
eNepper

Yanıtlar:


141

TypeScript 0.9+, numaralandırmalar için bir spesifikasyona sahiptir:

enum AnimationType {
    BOUNCE,
    DROP,
}

Son virgül isteğe bağlıdır.


11
enumTypeScript ekibi, değişeceğini açıkça belirttiği için yapının bu aşamada kullanılmamasını tavsiye ederim - bu yüzden bozulacaktır.
Fenton

1
Lütfen düzenleme araçlarıyla, örneğin cevabınıza eklediğiniz kodla kendinizi rahat ettirin. Cevabınızda değiştirdim, lütfen bir göz atın. Ayrıca, o dil özelliği hakkında ilgili bir tartışma varsa lütfen biraz referans bırakın.
hakre

enum Animasyon {BOUNCE = 1, DROP}, çünkü Maps API onları böyle tanımlıyor.
dchest


Numaralandırma ve üye adlandırma kuralları c # ile aynıdır. (her ikisi de Microsoft'tan). PascalCase. UPPER_CASE değil.
Dominik

66

TypeScript 0.9'dan itibaren (şu anda bir alfa sürümü), enum tanımını şu şekilde kullanabilirsiniz:

enum TShirtSize {
  Small,
  Medium,
  Large
}

var mySize = TShirtSize.Large;

Varsayılan olarak, bu numaralandırmalar sırasıyla 0, 1 ve 2 olarak atanacaktır. Bu sayıları açıkça ayarlamak istiyorsanız, bunu numaralandırma bildiriminin bir parçası olarak yapabilirsiniz.

6.2 Açık üyelerle numaralandırma listesi

enum TShirtSize {
  Small = 3,
  Medium = 5,
  Large = 8
}

var mySize = TShirtSize.Large;

Bu örneklerin her ikisi de doğrudan TypeScript for JavaScript Programmers'dan kaldırıldı .

Bunun 0.8 spesifikasyonundan farklı olduğunu unutmayın. 0.8 spesifikasyonu şuna benziyordu - ancak deneysel olarak işaretlendi ve muhtemelen değişeceği için herhangi bir eski kodu güncellemeniz gerekecek:

Sorumluluk reddi - bu 0.8 örnek, TypeScript derleyicisinin daha yeni sürümlerinde bozulur.

enum TShirtSize {
  Small: 3,
  Medium: 5,
  Large: 8
}

var mySize = TShirtSize.Large;

3
Hâlâ RC'de çalıştığından ve bu nedenle TS'nin gelecekteki sürümlerinden kopması muhtemel olmadığından, bu şimdi kabul edilen yanıt olmalıdır.
Adrian Grigore

24

Bu artık dilin bir parçası. Bkz TypeScriptLang.org> Temel Türleri> enum bu konuda belgeleri için. Bu numaralandırmaların nasıl kullanılacağına ilişkin belgelerden bir alıntı:

enum Color {Red, Green, Blue};
var c: Color = Color.Green;

Veya manuel destek numaraları ile:

enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;

Örneğin kullanarak enum adına geri dönebilirsiniz Color[2].

İşte tüm bunların nasıl bir araya geldiğine dair bir örnek:

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();

Bu günlüğe kaydeder:

undefined  
2  
Blue

Çünkü, bunu yazarken, Typescript Playground bu kodu üretecektir:

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();

14

Aşağıdakilerle bir id / string numaralandırabileceğiniz başka bir not:

class EnumyObjects{
    public static BOUNCE={str:"Bounce",id:1};
    public static DROP={str:"Drop",id:2};
    public static FALL={str:"Fall",id:3};


}

2
Bunlara nasıl erişir strve idkullanırsınız?
kba

1
EnumyObjects.BOUNCE.str değere erişir.
done_merson

2
Bu tasarımla ilgili sorun, nesnelerin hepsinin değiştirilebilir olması ve bu da sorunlara neden olabilmesidir
Fenton

Misiniz abstract classtypescript bir mefhumu yoktur çünkü örnekleme önlemek için daha uygun static class?
jocull

10

Güncelleme :

@ İX3 tarafından belirtildiği gibi, Typescript 2.4 enum dizeleri için desteğe sahiptir.

Bkz: Typescript'te dize değerleri ile bir enum oluşturma


Orijinal cevap:

String üye değerleri için, TypeScript yalnızca numaralandırma üye değerleri olarak sayılara izin verir. Ancak uygulayabileceğiniz birkaç çözüm / saldırı var;

1.Çözüm:

kopyalandı: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/

Basit bir çözüm var: Aşağıdakileri atamadan önce dizgeyi herhangi birine dönüştürün:

export enum Language {
    English = <any>"English",
    German = <any>"German",
    French = <any>"French",
    Italian = <any>"Italian"
}

çözüm 2:

kopyalandı: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html

Bir tür olarak bir dize hazır bilgisi kullanabilirsiniz. Örneğin:

let foo: 'Hello';

Burada foo adında, ona yalnızca 'Merhaba' değişmez değerinin atanmasına izin verecek bir değişken oluşturduk. Bu, aşağıda gösterilmiştir:

let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"

Kendi başlarına pek kullanışlı değillerdir, ancak güçlü (ve kullanışlı) bir soyutlama oluşturmak için bir tür birleşiminde birleştirilebilirler, örneğin:

type CardinalDirection =
    "North"
    | "East"
    | "South"
    | "West";

function move(distance: number, direction: CardinalDirection) {
    // ...
}

move(1,"North"); // Okay
move(1,"Nurth"); // Error!

1
TypeScript 2.4, numaralandırmalarda dize değişmez türleri için destek içerir. Stackoverflow.com/questions/15490560/… ve blogs.msdn.microsoft.com/typescript/2017/06/27/…
iX3

1

Typcript'teki numaralandırmalar:

Enumlar, adlandırılmış sabitler kümesini tanımlamak için dizgi diline yerleştirilir. Numaralandırmaları kullanmak hayatımızı kolaylaştırabilir. Bunun nedeni, bu sabitlerin genellikle numaralandırmanın temsil ettiği değerden daha kolay okunmasıdır.

Bir numaralandırma oluşturma:

enum Direction {
    Up = 1,
    Down,
    Left,
    Right,
}

Daktilo belgelerinden alınan bu örnek, numaralandırmanın nasıl çalıştığını çok güzel bir şekilde açıklamaktadır. İlk enum değerimizin (Yukarı) 1 ile başlatıldığına dikkat edin. Numaralandırmanın takip eden tüm üyeleri daha sonra bu değerden otomatik olarak artırılır (yani Aşağı = 2, Sol = 3, Sağ = 4). İlk değeri 1 ile başlatmazsak, sıralama 0'dan başlar ve ardından otomatik artış (yani Aşağı = 1, Sol = 2, Sağ = 3).

Bir numaralandırma kullanma:

Enum değerlerine şu şekilde erişebiliriz:

Direction.Up;     // first the enum name, then the dot operator followed by the enum value
Direction.Down;

Bu şekilde , kodumuzu yazma biçimimizde çok daha açıklayıcı olduğumuza dikkat edin. Numaralandırmalar temelde sihirli sayıları kullanmamızı engeller (bazı varlıkları temsil eden sayılar, çünkü programcı onlara belirli bir bağlamda bir anlam vermiştir). Sihirli sayılar aşağıdaki nedenlerden dolayı kötüdür:

  1. Daha fazla düşünmemiz gerekiyor, kodumuz hakkında mantık yürütmeden önce numarayı bir varlığa çevirmemiz gerekiyor.
  2. Uzun bir süre sonra kodumuzu gözden geçirirsek veya diğer programcılar kodumuzu gözden geçirirlerse, bu numaraların ne anlama geldiğini bilmiyorlar.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.