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.Animation
iki özellik içeren: BOUNCE
ve DROP
.
Bu, TypeScript'te nasıl yapılmalıdır?
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.Animation
iki özellik içeren: BOUNCE
ve DROP
.
Bu, TypeScript'te nasıl yapılmalıdır?
Yanıtlar:
TypeScript 0.9+, numaralandırmalar için bir spesifikasyona sahiptir:
enum AnimationType {
BOUNCE,
DROP,
}
Son virgül isteğe bağlıdır.
enum
TypeScript 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.
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;
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();
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};
}
str
ve id
kullanırsınız?
abstract class
typescript bir mefhumu yoktur çünkü örnekleme önlemek için daha uygun static class
?
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!
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.
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).
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: