typescript - Tại sao một câu lệnh switch trên enum lại báo lỗi 'không thể so sánh với kiểu'? }
Trong khi làm một hướng dẫn Lynda về Typescript (https://www.lynda.com/Visual-Studio-tutorials/TypeScript-types-part-2/543000/565613-4.html#tab), tôi gặp phải một trở ngại. Mã ví dụ minh họa cách các câu lệnh switch hoạt động trong TypeScript nhưng mã mà có vẻ hoạt động tốt đối với giảng viên lại ném ra lỗi Type 'x' is not comparable to type 'y'. Đây là mã:
enum temperature{
cold,
hot
}
let temp = temperature.cold;
switch (temp) {
case temperature.cold:
console.log("Brrr....");
break;
case temperature.hot:
console.log("Yikes...")
break;
}
Tôi nhận được một lỗi và các gợn sóng dưới case temperature.hot: kèm theo thông báo:
Type 'temperature.hot' is not comparable to type 'temperature.cold'
Chuyện gì vậy?
Câu trả lời #1
Điều đó là vì trình biên dịch đã biết rằng trường hợp temperature.hot sẽ không bao giờ xảy ra: biến temp được gán kiểu literal enum temperature.cold, mà chỉ có thể nhận giá trị đó (hoặc null nếu không có kiểm tra null nghiêm ngặt). Vì temperature.hot không phải là giá trị tương thích ở đây, trình biên dịch sẽ báo lỗi.
Nếu chúng ta loại bỏ thông tin về literal (bằng cách ép kiểu hoặc lấy giá trị từ một hàm):
function how_cold(celsius: number): temperature {
return celsius > 40 ? temperature.hot : temperature.cold;
}
Sau đó mã sẽ được biên dịch:
let temp = how_cold(35); // type is "temperature"
switch (temp) {
case temperature.cold:
console.log("Brrr....");
break;
case temperature.hot:
console.log("Yikes...")
break;
}
Ngoài ra, thêm + vào giá trị cũng hoạt động vì nó chuyển giá trị thành số, điều này cũng sẽ mở rộng phạm vi của kiểu và làm cho nó tương thích với tất cả các biến thể enum, cũng như các số khác.
let temp = temperature.cold;
switch (+temp) {
case temperature.cold:
console.log("Brrr....");
break;
case temperature.hot:
console.log("Yikes...")
break;
case 5:
console.log("What??");
break;
}
Câu trả lời #2
Một lý do khả thi khác có thể là nếu bạn kiểm tra xem biến enum không phải là null nhưng điều này cũng xảy ra nếu enumVal là 0. Điều này chỉ đúng nếu enum có các giá trị số mặc định (vì vậy mục đầu tiên nhận giá trị là 0)
if (!!enumVal) {
switch (enumVal) {
case EnumClass.First // the if clause automatically excludes the first item
