Typescript Switch语句抛出"与类型"错误无法匹配

Hor*_*kin 12 switch-statement typescript

对不起,我知道这是超级基本但似乎无法找到答案.在Typescript上做一个Lynda教程(https://www.lynda.com/Visual-Studio-tutorials/TypeScript-types-part-2/543000/565613-4.html#tab),我遇到了麻烦.示例代码说明了switch语句在TS中是如何工作的,但是对于教师而言似乎正常工作的代码抛出了类型'x'与类型'y'错误不可比.这是代码:

enum temperature{
    cold,
    hot
}

let temp = temperature.cold;

switch (temp) {
    case temperature.cold:
        console.log("Brrr....");
        break;
    case temperature.hot:
        console.log("Yikes...")
        break;
}
Run Code Online (Sandbox Code Playgroud)

我得到一个错误并在'case temperature.hot'下曲线说'Type'temperature'hot'与'temperature.cold'类型无法比较.是什么赋予了?

E_n*_*ate 13

这是因为编译器已经知道这种情况temperature.hot永远不会发生:变量temp被赋予枚举文字类型temperature.cold,只能为该值本身赋值(如果没有严格的空值检查,则为null).由于temperature.hot此处不是兼容值,编译器会抛出错误.

如果我们丢弃有关文字的信息(通过从函数中转换或检索值):

function how_cold(celsius: number): temperature {
    return celsius > 40 ? temperature.hot : temperature.cold;
}
Run Code Online (Sandbox Code Playgroud)

然后代码将编译:

let temp = how_cold(35); // type is "temperature"

switch (temp) {
    case temperature.cold:
        console.log("Brrr....");
        break;
    case temperature.hot:
        console.log("Yikes...")
        break;
}
Run Code Online (Sandbox Code Playgroud)

或者,+在值之前工作是因为它将值转换为数字,这也将扩大类型的范围并使其与所有枚举变体以及其他数字兼容.

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;
}
Run Code Online (Sandbox Code Playgroud)


Kri*_*obs 6

另一个可能的原因可能是如果您检查 enum 变量 is notnull但这也会触发 if enumValis 0。这仅在枚举具有默认数值时才成立(因此第一项获得 的值0

if (!!enumVal) {
    switch (enumVal) {
         case EnumClass.First // the if clause automatically excludes the first item
Run Code Online (Sandbox Code Playgroud)