2016-09-30 18 views
17

Trong TypeScript, tôi muốn so sánh hai biến chứa giá trị enum. Đây là mã tối thiểu ví dụ của tôi:Cách so sánh Enums trong TypeScript

enum E { 
    A, 
    B 
} 

let e1: E = E.A 
let e2: E = E.B 

if (e1 === e2) { 
    console.log("equal") 
} 

Khi biên dịch với tsc (v 2.0.3) tôi nhận được lỗi sau:

TS2365: Operator '===' cannot be applied to types 'E.A' and 'E.B'.

Cùng với ==, !==!=. Tôi đã thử thêm từ khóa const nhưng điều đó dường như không có hiệu lực. Các TypeScript spec nói như sau:

4.19.3 The <, >, <=, >=, ==, !=, ===, and !== operators

These operators require one or both of the operand types to be assignable to the other. The result is always of the Boolean primitive type.

nào (tôi nghĩ) giải thích lỗi. Nhưng làm thế nào tôi có thể làm tròn nó?

Side lưu ý
Tôi đang sử dụng trình biên tập Atom với atom-typescript, và tôi không nhận được bất kỳ lỗi/cảnh báo trong trình soạn thảo của tôi. Nhưng khi tôi chạy tsc trong cùng một thư mục tôi nhận được lỗi ở trên. Tôi nghĩ rằng họ có nghĩa vụ phải sử dụng cùng một tập tin tsconfig.json, nhưng rõ ràng đó không phải là trường hợp.

Trả lời

7

Có một cách khác: nếu bạn không muốn tạo ra mã javascript để bị ảnh hưởng trong bất kỳ cách nào, bạn có thể sử dụng loại diễn viên:

let e1: E = E.A 
let e2: E = E.B 


if (e1 as E === e2 as E) { 
    console.log("equal") 
} 

Nói chung, điều này được gây ra bởi loại kiểm soát dòng chảy dựa suy luận. Với thực hiện nguyên cảo hiện nay, nó tắt bất cứ khi nào gọi hàm được tham gia, vì vậy bạn cũng có thể làm điều này:

let id = a => a 

let e1: E = id(E.A) 
let e2: E = id(E.B) 

if (e1 === e2) { 
    console.log('equal'); 
} 

Điều lạ là, vẫn không có lỗi nếu chức năng id bị tuyên bố quay trở lại một cách chính xác cùng loại như agument của nó:

function id<T>(t: T): T { return t; } 
5

Vâng, tôi nghĩ rằng tôi tìm thấy một cái gì đó mà làm việc:

if (e1.valueOf() === e2.valueOf()) { 
    console.log("equal") 
} 

Nhưng tôi là một chút ngạc nhiên rằng đây không được đề cập bất cứ nơi nào trong tài liệu.

+1

Điều đó không làm việc cho tôi. Tôi đang nhận được một undefined – dave0688

1

điều duy nhất mà làm việc cho tôi (trong nguyên cảo 2.2.1) là này:

if (E[e1] === E[e2]) { 
    console.log("equal") 
} 

này so sánh t các chuỗi ký tự đại diện cho các tên (ví dụ: "A và B").

0

Nếu đã có thể so sánh hai enums với điều này

if (product.ProductType && 
     (product.ProductType.toString() == ProductTypes[ProductTypes.Merchandises])) { 
     // yes this item is of merchandises 
    } 

với ProductTypes bị này export enum ProductTypes{Merchandises,Goods,...}