Làm cách nào để tạo kiểu enum like trong TypeScript?


121

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.Animationchứa hai thuộc tính: BOUNCEDROP.

Điều này nên được thực hiện như thế nào trong TypeScript?


3
Định nghĩa v3 Google Maps đã hoàn tất và có thể được tìm thấy trên GithubNuGet
eNepper

Câu trả lời:


141

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.


11
Tôi khuyên bạn không nên sử dụng enumcấ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.
Fenton

1
Hãy làm cho bạn thoải mái với các công cụ chỉnh sửa, chẳng hạn như với mã bạn thêm vào câu trả lời của mình. Tôi đã thay đổi nó trong câu trả lời của bạn cho, hãy xem. Ngoài ra, vui lòng để lại một số tài liệu tham khảo nếu có một cuộc thảo luận liên quan về tính năng ngôn ngữ đó.
hakre

enum Animation {BOUNCE = 1, DROP}, vì đó là cách API Maps xác định chúng.
dchest 17/10/12


Enum và các quy ước đặt tên thành viên của nó giống như trong c #. (cả của Microsoft). Đó là PascalCase. Không phải UPPER_CASE.
Dominik

66

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;

3
Đây bây giờ nên là câu trả lời được chấp nhận vì nó vẫn đang hoạt động trong RC và do đó khó có khả năng bị phá vỡ với các phiên bản TS trong tương lai.
Adrian Grigore

24

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

14

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


}

2
Làm thế nào bạn sẽ truy cập của họ stridsử dụng nó?
kba

1
EnumyObjects.BOUNCE.str sẽ truy cập giá trị.
done_merson

2
Vấn đề với thiết kế này là các đối tượng đều có thể thay đổi, mà có thể gây ra vấn đề: goo.gl/CT4Ip
Fenton

Sẽ abstract classthí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?
jocull

10

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!

1
TypeScript 2.4 bao gồm hỗ trợ cho các kiểu ký tự chuỗi trong enums. Xem stackoverflow.com/questions/15490560/...blogs.msdn.microsoft.com/typescript/2017/06/27/...
iX3

1

Enums in typecript:

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.

Tạo một enum:

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

Sử dụng một enum:

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:

  1. Chúng ta cần suy nghĩ kỹ hơn, trước tiên chúng ta cần dịch số sang một thực thể trước khi có thể suy luận về mã của mình.
  2. Nếu chúng tôi xem lại mã của mình sau một thời gian dài hoặc các lập trình viên khác xem lại mã của chúng tôi, họ không nhất thiết phải biết ý nghĩa của những con số này.
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.