2012-12-19 40 views
10

Tôi đã viết một số bài kiểm tra đơn vị trong TypeScript. Các thử nghiệm ví dụ QUnit chứa:Double Equals (==) trong TypeScript

ok(1 == "1", "Passed!"); 

Trình biên dịch tsc tuyên bố rằng:

Operator '==' không thể được áp dụng cho các loại 'số' và 'chuỗi'

Và lối ra với trạng thái 1 (mặc dù nó thực hiện chính xác JS).

Các spec nói:!

Các <,>, < =,> =, ==, =, ===, và các nhà khai thác ==

Những nhà khai thác đòi hỏi một loại toán hạng giống hệt hoặc loại phụ của loại toán hạng khác. Kết quả luôn luôn là kiểu nguyên thủy Boolean.

Vì vậy, có vẻ như cảnh báo/lỗi là chính xác. Không phải điều này thay vì đánh bại điểm của các loại cocing == nhà điều hành mặc dù? Có bao giờ một trường hợp sử dụng hợp lệ để sử dụng == trong TypeScript mà sẽ không xuất hiện cảnh báo này?

Trả lời

11

Ít nhất một kịch bản có thể xảy ra cho == (ví dụ, với kiểu ép buộc) trong nguyên cảo là khi một trong các toán hạng dự kiến ​​là loại Bất kỳ:

Một loại S là một subtype của một loại T, và T là siêu kiểu của S, nếu một trong các số sau đây là đúng: [...]

T là loại bất kỳ.

Bây giờ bạn có thể xem hình ảnh: bất kỳ chức năng nào có Bất kỳ param thể một cách an toàn (tốt, hơn-o-ít, tất cả các vấn đề thường của == vẫn áp dụng ở đây) so sánh nó với giá trị của bất kỳ bộ nhập với ==.

3

Một trong những điểm của TypeScript có nghĩa là chúng tôi viết JavaScript rõ ràng hơn. Làm một cái gì đó như 1 == "1" và nó sẽ không hoạt động trừ khi bạn cast nó một cách rõ ràng hoặc sử dụng ToString()/ParseInt() anyway tùy thuộc vào việc bạn đang mong đợi để so sánh chuỗi hoặc số.

Bạn có thể sử dụng Bất kỳ để các biến hoạt động như các biến JavaScript động thông thường nhưng sau đó bạn sẽ mất đi điểm quan trọng của TS được hưởng lợi từ hệ thống suy luận loại/gõ mạnh mẽ giúp chúng ta không bị lỗi nhiều JavaScript gotchas tồn tại vì các quy tắc cưỡng chế kiểu tự động của nó.

6

Dưới đây là một số ví dụ điển hình về TypeScript được trình biên dịch cho phép và sử dụng ==.

var a: string = "A"; 
var b: Object = "A"; 

if (a == b) { 
    alert("Example 1"); 
} 

var c: any = "1"; 
var d: number = 1; 

if (c == d) { 
    alert("Example 2"); 
} 

var e: any = "E"; 
var f: string = "E"; 

if (e == f) { 
    alert("Example 3"); 
}