【问题标题】:Using a NONE value in an Enum instead of undefined在枚举中使用 NONE 值而不是 undefined
【发布时间】:2021-02-23 13:54:43
【问题描述】:

我只是想知道这一点,因为我已经在代码中看到过几次。在 typescript 枚举中检查 undefined 有时会导致像本例中那样的意外行为。

  enum DoSomething {
    VALUE1,
    VALUE2,
    VALUE3,
  }
  function doSomething(doSomething?: DoSomething): void {
    if (doSomething) {
      console.log('do something')
    } else {
      console.log('do nothing')
    }
  }
  doSomething(undefined) // -> do nothing
  doSomething(DoSomething.VALUE1) // -> do nothing
  doSomething(DoSomething.VALUE2) // -> do something

这当然是因为枚举的 VALUE1 实际上是 0。在枚举的第一个位置使用 NONE 之类的东西并且不允许 undefined 以防止其他人遇到这种情况是否有意义?

  enum DoSomething {
    NONE,
    VALUE1,
    VALUE2,
    VALUE3,
  }
  function doSomething(doSomething: DoSomething): void {
    if (doSomething) {
      console.log('do something')
    } else {
      console.log('do nothing')
    }
  }
  doSomething(DoSomething.NONE) // -> do nothing
  doSomething(DoSomething.VALUE1) // -> do something
  doSomething(DoSomething.VALUE2) // -> do something

我的意思是当然你可以总是明确地检查 undefined ...但是如果你没有考虑 if(0) 可能需要一些时间来找出错误,因为它只对第一个值失败枚举。有什么想法/意见吗?

【问题讨论】:

  • 一个好的测试套件可能会捕捉到这样的错误:)
  • 您还可以为枚举分配默认值以外的值,以使它们不是 falsyenum DoSomething { VALUE1 = 1543 }

标签: javascript typescript ecmascript-6 enums


【解决方案1】:

您的问题基本上是关于代码约定的,这也可能取决于您工作的公司。 您的示例过于抽象,违反了不依赖于公司的代码约定。

正如你所说,根据具体情况,你会明确检查 undefined,如果有人通过它可能是一个真正的问题。 您也可以认为“某人”有责任确保不传递错误的参数,在您的情况下是保留关键字。

但为了回答,我会说,是的,这可能是有道理的,但不是必须的,这取决于情况和您的指导方针:

enum DoSomething {
    DoNot= 0,
    Do = 1,
    AlsoDo = 2,
}

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多