为什么对枚举的switch语句抛出“无法与类型相比”错误?

霍金

在使用有关Typescript的Lynda教程(https://www.lynda.com/Visual-Studio-tutorials/TypeScript-types-part-2/543000/565613-4.html#tab)时,我遇到了麻烦该示例代码说明了switch语句如何在TypeScript中工作,但是似乎对教师而言正常的代码抛出类型“ 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;
}

我得到一个错误,并在下面case temperature.hot:说:

Type 'temperature.hot' is not comparable to type 'temperature.cold'

是什么赋予了?

E_net4有几个朋友

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

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

function how_cold(celsius: number): temperature {
    return celsius > 40 ? temperature.hot : temperature.cold;
}

该代码将随后编译:

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

switch (temp) {
    case temperature.cold:
        console.log("Brrr....");
        break;
    case temperature.hot:
        console.log("Yikes...")
        break;
}

另外,+在值之前加上前缀是可行的,因为它将值转换为数字,这也将扩大类型的范围,并使其与所有枚举变体以及其他数字兼容。

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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

错误为什么使用if语句匹配枚举

为什么Typescript无法根据枚举开关语句来推断正确的类型?

与枚举类型的变量相比,为什么“ typeof枚举常量”会生成警告?

Azure:PHP SQL Webjob无法正常工作。为什么在查询“ execute()”语句中抛出该错误?

为什么在switch语句中不能完全限定枚举值?

为什么Typescript无法在Deep / Nested属性的switch语句中推断类型

为什么MERGE语句抛出唯一的键约束错误

为什么常规语句的最后的“:”不抛出任何错误?

为什么下面的 TypeScript 程序不会抛出类型错误?

为什么这个映射声明会抛出类型错误?

为什么此switch语句无法识别subString?

在枚举上的Java switch语句中,为什么在每种情况下限定我的值时都出现编译错误?

我使用 swift 收到错误“字符串”无法匹配我的 Switch 语句中的值,为什么?

为什么解析方法抛出“int”类型不是“String”类型错误的子类型?

为什么在switch语句中有每个枚举常量的用例时,为什么仍必须提供默认值?

为什么if语句优先于switch语句?

为什么我的float变量语句不断显示“无法将类型double隐式转换为float”错误?

为什么不能在switch表达式中使用我的枚举类型?

为什么这个最小的RNN代码会为从未使用过的类型抛出类型错误?

为什么在类型声明中使用类型联合时 TypeScript 会抛出错误?

为什么会出现此“无法到达的语句”错误?

嵌套的IIf语句可以工作,但是Switch语句在MS Access中产生“溢出”错误。为什么?

为什么会出现在while语句中被抛出的错误?

为什么不编译器抛出一个错误说“不return语句”?

为什么抛出未经检查的异常会消除“丢失的返回语句”错误

为什么在检查If语句未定义时会抛出未定义的错误?

为什么枚举类的默认类型与基本枚举类型不同?

为什么Java编译器不会为无法到达的then语句产生无法到达的语句错误?

Switch 语句与枚举变量