检查字符串是否在ENUM TypeScript中

5
我有一些类似于这样的枚举:
export enum Languages {
  nl = 1,
  fr = 2,
  en = 3,
  de = 4
}

有些const language ='de';

我只需要检查枚举约束是否为常量语言,我知道我可以使用includes来检查数组,但是如何检查ENUM?

此外,我知道我可以像这样检查

if (type in Languages) {
}

但这个工作是IT数字,而不是字符串。

2个回答

7
你可以使用 Object.keys() 来访问枚举键,然后再使用简单的 Array.prototype.includes()
enum Languages {
  nl = 1,
  fr = 2,
  en = 3,
  de = 4,
}

const language = "de";

console.log(Object.keys(Languages).includes(language)); //true

TypeScript playground(TypeScript游乐场)是一个在线的编程环境,可以用来测试和运行TypeScript代码。

这个功能可行的原因在于枚举(Enum)在转译成JavaScript之后就变成了一个简单的对象:

var Languages;
(function(Languages) {
  Languages[(Languages["nl"] = 1)] = "nl";
  Languages[(Languages["fr"] = 2)] = "fr";
  Languages[(Languages["en"] = 3)] = "en";
  Languages[(Languages["de"] = 4)] = "de";
})(Languages || (Languages = {}));

console.log(Languages);
.as-console-wrapper {
  min-height: 100%;
}


想象一下,仅仅为了检查一个变量是否是枚举成员,就需要使用两个_O(n)_操作... - undefined

0
让我们以 O(1) 的复杂度来完成吧...
给定一个通用的不变函数 -
function invariant(condition: unknown, message?: string): asserts condition {
  if (condition) return
  throw Error(`Invariant violation: ${message ?? "truthy value expected"}`)
}

使用keyof typeof Language编写invariantLanguage
function invariantLanguage(lang: string): asserts lang is keyof typeof Language {
  invariant(lang in Language, `"${lang}" is not a valid language`)
}

现在你可以在字符串输入上使用invariantLanguage -
// ...

enum Language {
  nl = 1,
  fr = 2,
  en = 3,
  de = 4,
}

const x = "en"
invariantLanguage(x)
console.log(x) // : "en"

const y = "foo"
invariantLanguage(y) // ERROR Invariant violation: "foo" is not a valid language
console.log(y) // : never

在TypeScript Playground上验证


它还展示了与字符串枚举正常工作的示例 -
// ...

enum Language {
  nl = 1,
  fr = 2,
  en = 3,
  de = 4,
  ja = "japanese", // also works if you have strings
}

const x = "ja"
invariantLanguage(x)
console.log(x) // : "ja"

请注意不要将“值”误认为“键”。
const y = "japanese"
invariantLanguage(y) // ERROR Invariant violation: "japanese" is not a valid language
console.log(y) // : never

请在TypeScript Playground上进行验证。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接