首页 > 解决方案 > 在枚举中使用 NONE 值而不是 undefined

问题描述

我只是想知道这一点,因为我在代码中已经看过几次了。在 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) 可能需要一些时间来找出错误,因为它只对枚举的第一个值失败。有什么想法/意见吗?

标签: javascripttypescriptecmascript-6enums

解决方案


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

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

但是为了得到答案,我会说,是的,这可能是有道理的,但不一定要这样做,具体取决于情况和您的指导方针:

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

推荐阅读