Tôi đang làm việc trên một tệp định nghĩa cho API Google maps cho TypeScript.
Và tôi cần xác định một kiểu enum như ví dụ. google.maps.Animation
chứa hai thuộc tính: BOUNCE
và DROP
.
Điều này nên được thực hiện như thế nào trong TypeScript?
Tôi đang làm việc trên một tệp định nghĩa cho API Google maps cho TypeScript.
Và tôi cần xác định một kiểu enum như ví dụ. google.maps.Animation
chứa hai thuộc tính: BOUNCE
và DROP
.
Điều này nên được thực hiện như thế nào trong TypeScript?
Câu trả lời:
TypeScript 0.9+ có đặc điểm kỹ thuật cho enums:
enum AnimationType {
BOUNCE,
DROP,
}
Dấu phẩy cuối cùng là tùy chọn.
enum
cấu trúc ở giai đoạn này vì nhóm TypeScript đã nói rõ rằng nó sẽ thay đổi - vì vậy nó sẽ bị hỏng.
Kể từ TypeScript 0.9 (hiện là bản phát hành alpha), bạn có thể sử dụng định nghĩa enum như sau:
enum TShirtSize {
Small,
Medium,
Large
}
var mySize = TShirtSize.Large;
Theo mặc định, các bảng liệt kê này sẽ được gán lần lượt là 0, 1 và 2. Nếu bạn muốn đặt các số này một cách rõ ràng, bạn có thể làm như vậy như một phần của khai báo enum.
Liệt kê 6.2 Các bảng kê có các thành viên rõ ràng
enum TShirtSize {
Small = 3,
Medium = 5,
Large = 8
}
var mySize = TShirtSize.Large;
Cả hai ví dụ này đều được loại bỏ trực tiếp khỏi TypeScript dành cho Lập trình viên JavaScript .
Lưu ý rằng điều này khác với đặc điểm kỹ thuật 0.8. Đặc tả 0.8 trông như thế này - nhưng nó được đánh dấu là thử nghiệm và có khả năng thay đổi, vì vậy bạn sẽ phải cập nhật bất kỳ mã cũ nào:
Tuyên bố từ chối trách nhiệm - ví dụ 0.8 này sẽ bị hỏng trong các phiên bản mới hơn của trình biên dịch TypeScript.
enum TShirtSize {
Small: 3,
Medium: 5,
Large: 8
}
var mySize = TShirtSize.Large;
Đây là một phần của ngôn ngữ. Xem TypeScriptLang.org> Loại Cơ bản> enum để biết tài liệu về điều này. Một đoạn trích từ tài liệu về cách sử dụng các enum này:
enum Color {Red, Green, Blue};
var c: Color = Color.Green;
Hoặc với số sao lưu thủ công:
enum Color {Red = 1, Green = 2, Blue = 4};
var c: Color = Color.Green;
Bạn cũng có thể quay lại tên enum bằng cách sử dụng ví dụ Color[2]
.
Dưới đây là một ví dụ về cách tất cả điều này kết hợp với nhau:
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();
Điều này sẽ ghi lại:
undefined 2 Blue
Bởi vì, tại thời điểm viết bài này, Sân chơi kịch bản sẽ tạo ra mã này:
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();
Chỉ cần lưu ý khác rằng bạn có thể một id / string enum với những điều sau:
class EnumyObjects{
public static BOUNCE={str:"Bounce",id:1};
public static DROP={str:"Drop",id:2};
public static FALL={str:"Fall",id:3};
}
str
và id
sử dụng nó?
abstract class
thích hợp hơn để ngăn việc khởi tạo vì TypeScript không có khái niệm về một static class
?
Cập nhật :
Như đã lưu ý bởi @ iX3, Typescript 2.4 hỗ trợ chuỗi enum.
Xem: Tạo một enum với các giá trị chuỗi trong Typecript
Câu trả lời ban đầu:
Đối với giá trị thành viên chuỗi, TypeScript chỉ cho phép các số dưới dạng giá trị thành viên enum. Nhưng có một số giải pháp / hack bạn có thể thực hiện;
Giải pháp 1:
được sao chép từ: https://blog.rsuter.com/how-to-implement-an-enum-with-string-values-in-typescript/
Có một giải pháp đơn giản: Chỉ cần ép kiểu chuỗi ký tự thành bất kỳ trước khi gán:
export enum Language {
English = <any>"English",
German = <any>"German",
French = <any>"French",
Italian = <any>"Italian"
}
giải pháp 2:
được sao chép từ: https://basarat.gitbooks.io/typescript/content/docs/types/literal-types.html
Bạn có thể sử dụng một chuỗi ký tự làm kiểu. Ví dụ:
let foo: 'Hello';
Ở đây chúng tôi đã tạo một biến có tên là foo sẽ chỉ cho phép gán giá trị chữ 'Hello' cho nó. Điều này được minh họa dưới đây:
let foo: 'Hello';
foo = 'Bar'; // Error: "Bar" is not assignable to type "Hello"
Bản thân chúng không hữu ích lắm nhưng có thể được kết hợp trong một liên hợp kiểu để tạo ra một trừu tượng mạnh mẽ (và hữu ích), ví dụ:
type CardinalDirection =
"North"
| "East"
| "South"
| "West";
function move(distance: number, direction: CardinalDirection) {
// ...
}
move(1,"North"); // Okay
move(1,"Nurth"); // Error!
Enums được đưa vào ngôn ngữ typecript để định nghĩa một tập hợp các hằng được đặt tên. Sử dụng enum có thể làm cho cuộc sống của chúng ta dễ dàng hơn. Lý do cho điều này là những hằng số này thường dễ đọc hơn giá trị mà enum đại diện.
enum Direction {
Up = 1,
Down,
Left,
Right,
}
Ví dụ này từ các tài liệu về biên bản giải thích rất hay về cách hoạt động của enums. Lưu ý rằng giá trị enum đầu tiên của chúng ta (Lên) được khởi tạo bằng 1. Tất cả các thành viên sau của số enum sau đó được tự động tăng lên từ giá trị này (tức là Xuống = 2, Trái = 3, Phải = 4). Nếu chúng ta không khởi tạo giá trị đầu tiên bằng 1 thì enum sẽ bắt đầu ở 0 và sau đó tự động tăng (tức là Xuống = 1, Trái = 2, Phải = 3).
Chúng ta có thể truy cập các giá trị của enum theo cách sau:
Direction.Up; // first the enum name, then the dot operator followed by the enum value
Direction.Down;
Lưu ý rằng theo cách này, chúng ta mô tả nhiều hơn trong cách chúng ta viết mã của mình. Enums về cơ bản ngăn chúng ta sử dụng các số ma thuật (các số đại diện cho một số thực thể vì lập trình viên đã đưa ra ý nghĩa cho chúng trong một ngữ cảnh nhất định). Số ma thuật là xấu vì những lý do sau: