我有一个函数,log
,它接受一个可选参数level
,它是来自枚举Level
的值。它们的定义如下:
enum Level {
Debug,
Information
}
const log = (message: string, level?: Level) => {
if (!level) {
console.warn("The `level` parameter of `log` will no longer be optional in version 1.0.0");
console.log(message);
return;
}
console.log(Level[level] + ": " + message);
};
如您所见,我正在检查 level
是否为假,因为如果他们不提供警告消息,我想记录一条警告消息。
当我像这样调用函数时,它的行为正确:
log("some log message"); // logs the warning
如果我使用 Level.Information
,它也会正确运行,但如果我使用 Level.Debug
调用该函数,我会收到警告消息。
为什么会发生这种情况?
最佳答案
“虚假”检查会检查很多事情。仅举几例,它会检查:
- 该值是否
未定义
? - 该值是
0
吗?
当参数未提供给您的函数时(例如,当您调用 log("foo")
时),level
将为 undefined
,因此您的检查行为正确。
但是,在运行时,Level
的定义如下:
{
0: "Debug",
1: "Information",
Debug: 0,
Information: 1
}
这意味着当您调用 log("foo", Level.Debug)
时,该函数实际上会作为 log("foo", 0)
执行。因此,这会通过您的错误检查并记录警告消息。
要解决此问题,请显式与未定义进行比较:
if (level === undefined) {
console.warn("The `level` parameter of `log` will no longer be optional in version 1.0.0");
console.log(message);
return;
}
console.log(Level[level] + ": " + message);
关于javascript - 可选的枚举参数在提供时为假,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52737978/