我有一个函数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 :(得分:1)
“虚假”检查会检查很多东西。仅举几例,它会检查:
undefined
吗?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);