javascript - 可选的枚举参数在提供时为假

标签 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 调用该函数,我会收到警告消息。

为什么会发生这种情况?

最佳答案

“虚假”检查会检查很多事情。仅举几例,它会检查:

  • 该值是否未定义
  • 该值是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/

相关文章:

node.js - Typescript build "Cannot find module",但仅在 ubuntu 服务器上

typescript - npm 不更新 tsc 版本

Typescript:条件类型中的联合类型转换为从不

javascript - 确定带小数点和不带小数点的价格

javascript - jquery 条件选择器

javascript - 对齐父项下的下拉列表内容

typescript - 我如何告诉 typescript 元组中的最后一个参数始终是一个函数?

javascript - Optimizely 和 Visual Website Optimizer 如何处理可视 DOM 编辑?

javascript - Internet Explorer (10, 11) 加载 Angular 2 应用程序非常慢

Angular Material 表页脚总计