Typescript Switch语句抛出“与类型”错误无法比较

时间:2017-07-19 17:30:22

标签: typescript switch-statement

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

function enumDemo() {
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'与'temperature.cold'类型无法比较。是什么给了什么?

4 个答案:

答案 0 :(得分:10)

那是因为编译器已经知道案例temperature.hot永远不会发生:变量temp被赋予枚举文字类型temperature.cold,只能为该值赋值(或者如果没有严格的空值检查,则返回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;
}

答案 1 :(得分:0)

另一个可能的原因可能是,如果您检查枚举变量是否不是null,但是如果enumVal0,这也会触发。仅当枚举具有默认数字值时(第一个项的值为0),这才成立。

if (!!enumVal) {
    switch (enumVal) {
         case EnumClass.First // the if clause automatically excludes the first item

答案 2 :(得分:0)

在我的情况下,问题出在@Kris所提到的。
我必须添加

if (icon !== null) {
    switch (icon) {

或将枚举的第一个值更改为1而不是0

export enum ICON_TYPE {
    ICON_A = 1,
    ICON_B = 2
}

答案 3 :(得分:0)

@E_net4 the curator 的回答很好,但是没有给出转换的例子。这里我使用强制转换来忽略编译器对常量 debug_level 的了解。

type DebugLevel = 'log' | 'warn' | 'error';

const debug_lvl: DebugLevel = 'warn';

switch((debug_lvl as DebugLevel)){
  case 'error':
    console.error(...args);
    break;

  case 'warn':
    console.warn(...args);
    break;

  case 'log':
    console.log(...args);
    break;
}