爲什麼在TypeScript中編譯以下代碼?TypeScript:枚舉類型的隱式編號
enum xEnum {
X1,X2
}
function test(x: xEnum) {
}
test(6);
它不應該拋出一個錯誤?恕我直言,這隱含的演員在這裏是錯的,不是嗎?
爲什麼在TypeScript中編譯以下代碼?TypeScript:枚舉類型的隱式編號
enum xEnum {
X1,X2
}
function test(x: xEnum) {
}
test(6);
它不應該拋出一個錯誤?恕我直言,這隱含的演員在這裏是錯的,不是嗎?
這是語言規範的一部分(3.2.7枚舉類型):
枚舉類型是可分配給編號基本類型,反之亦然 ,但不同的枚舉類型是不能分配給彼此
因此,決定允許在number
和Enum
之間進行隱式轉換,反之亦然是故意的。
這意味着您需要確保該值有效。
function test(x: xEnum) {
if (typeof xEnum[x] === 'undefined') {
alert('Bad enum');
}
console.log(x);
}
雖然你可能不執行達成一致,但值得注意的是,枚舉在這三種情況下非常有用:
// 1. Enums are useful here:
test(xEnum.X2);
// 2. ...and here
test(yEnum.X2);
和3 - 當你輸入test(
它會告訴你枚舉你可以用來保證你選擇一個存在的類型。
不,不應該。這裏沒有類型轉換,它們後面的基類型都是相同的整數。
typescript enum type checking works fine
你的投訴是關於範圍值,在這種情況下,有沒有關係類型檢查。
enum is a flexible set of constants
enum xEnum {X1=6, X2} // ruins it for test(0)
「廢墟」是什麼意思?代碼完美工作,沒有錯誤發生。 – Narretz 2018-03-09 11:08:15
OK,THX指出了這一點。這是一個明智的決定嗎?我的意思是,在這種情況下,枚舉類型根本沒有用處。 – duedl0r 2014-09-10 10:39:01
這是明智的,你主要使用網絡服務器,然後它只是一個數字 – basarat 2014-09-10 12:05:14
我添加了三個枚舉比數字更好的情況。我知道如果不包括你的情況(如果語言規範改變以去除隱含的'number' - >'enum'轉換,它可以做到這一點),但仍然有一些有用的理由來使用它。他們不是「壞」,只是「不如你想要的完美」:) – Fenton 2014-09-10 12:36:55