提供时,可选的enum参数是虚假的

时间:2018-10-10 10:19:56

标签: javascript typescript

我有一个函数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调用该函数,则会收到警告消息。

为什么会这样?

1 个答案:

答案 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);