2017-07-19 251 views
0

对不起,我知道这是超级基础,但似乎无法找到答案。在Typescript上做一个Lynda教程(https://www.lynda.com/Visual-Studio-tutorials/TypeScript-types-part-2/543000/565613-4.html#tab),我遇到了麻烦。示例代码说明了switch语句在TS中的工作方式,但对于指导者来说,似乎正常工作的代码会引发类型'x',这与类型'y'错误没有可比性。下面的代码:Typescript Switch语句抛出'不能类型'错误

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; 

}} 

我下得“的情况下temperature.hot”的错误和潦草的字迹说“类型‘temperature.hot’没有可比性键入‘temperature.cold’。是什么赋予了?

回答

0

这是因为编译器已经知道的情况下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; 
}