首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Enum值数组:使用Array.includes检查Enum键?

Enum值数组:使用Array.includes检查Enum键?
EN

Stack Overflow用户
提问于 2021-09-25 09:29:38
回答 1查看 596关注 0票数 3

我有以下TypeScript Enum:

代码语言:javascript
运行
复制
export enum Brennstoff {
    OEL = "Öl",
    GAS = "Gas",
    SOLAR = "Solar",
}

我有一个多选择的Brennstoff输入,它返回一个键数组:

代码语言:javascript
运行
复制
const selected = ["GAS", "SOLAR"]

如何检查数组是否包含条目?以下内容不起作用

代码语言:javascript
运行
复制
selected.includes(Brennstoff.GAS)

操场链接

因为Brennstoff.GAS返回Gas,所以它会查找值,但是我需要查找键。

我如何在TypeScript中做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-25 15:02:47

导言& TL;DR

为您提供两种解决方案,这两种解决方案都依赖于一小部分我们将在下面介绍的设置:

  1. 对于selected使用更严格的类型,因此它只能包含有效的Brennstoff键,如下所示: Console.log(key => Brennstoffkey === Brennstoff.GAS);// true console.log(selected.some(key => Brennstoffkey === Brennstoff.OEL));// false
  2. selected保持为string[],如下所示: Console.log(key => isBrennstoffKey(key) & Brennstoffkey === Brennstoff.GAS);// true console.log(selected.some(key => isBrennstoffKey(key) & Brennstoffkey === Brennstoff.OEL));// false

验证密钥

这两种解决方案都涉及验证字符串是否是有效的Brennstoff键,因此让我们先来看一看:

您可以使用类型断言函数来验证键。Brennstoff键的类型是keyof typeof Brennstoff,但是您可能会发现有一个别名是有用的:

代码语言:javascript
运行
复制
type BrennstoffKey = keyof typeof Brennstoff;

然后断言函数看起来如下所示:

代码语言:javascript
运行
复制
const BrennstoffKeys = new Set(Object.keys(Brennstoff));
function assertBrennstoffKey(key: string): asserts key is BrennstoffKey {
    if (!BrennstoffKeys.has(key)) {
        throw new Error(`Invalid Brennstoff key "${key}"`);
    }
}

(您不必使用Set,每次要进行验证时都可以调用Object.keys。)

我冒昧地假设每个值只有一个键。

我发现我经常想要类型保护版本和断言版本;这种组合应该是这样的:

代码语言:javascript
运行
复制
const BrennstoffKeys = new Set(Object.keys(Brennstoff));
function isBrennstoffKey(key: string): key is BrennstoffKey {
    return BrennstoffKeys.has(key);
}
function assertBrennstoffKey(key: string): asserts key is BrennstoffKey {
    if (!isBrennstoffKey(key)) {
        throw new Error(`Invalid Brennstoff key "${key}"`);
    }
}

有了这些,我们来看看两种方法.

selected使用更严格的类型

如果selected将包含来自Brennstoff的密钥名,那么我建议这样声明- BrennstoffKey[]

代码语言:javascript
运行
复制
const selected: BrennstoffKey[] = [];

然后,在添加字符串之前验证它们:

代码语言:javascript
运行
复制
let key: string = /*...*/;
assertBrennstoffKey(key);
selected.push(key);

要检查它是否有密钥,因为selected的类型足够严格,我们可以使用some来查看它中是否有特定值的键:

代码语言:javascript
运行
复制
console.log(selected.some(key => Brennstoff[key] === Brennstoff.GAS)); // true
console.log(selected.some(key => Brennstoff[key] === Brennstoff.OEL)); // false

操场链接

selectedstring[]

如果您希望将selected保持为string[],那么在执行检查时我们将应用验证:

如果您乐于做一些预先准备(也许是在定义Brennstoff之后),这是非常简单的:

代码语言:javascript
运行
复制
console.log(selected.some(key => isBrennstoffKey(key) && Brennstoff[key] === Brennstoff.GAS)); // true
console.log(selected.some(key => isBrennstoffKey(key) && Brennstoff[key] === Brennstoff.OEL)); // false

操场链接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69324847

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档