抱歉,我知道这是超级基本但似乎无法找到答案。做一个关于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'类型无法比较。是什么给了什么?
答案 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
,但是如果enumVal
是0
,这也会触发。仅当枚举具有默认数字值时(第一个项的值为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;
}