typescript - 枚举值数组 : check for Enum keys with Array. 包括?

标签 typescript

我有以下 TypeScript 枚举:

export enum Brennstoff {
    OEL = "Öl",
    GAS = "Gas",
    SOLAR = "Solar",
}

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

const selected = ["GAS", "SOLAR"]

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

selected.includes(Brennstoff.GAS)

Playground link

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

我如何在 TypeScript 中执行此操作?

最佳答案

简介 & TL;DR

为您提供两种解决方案,这两种解决方案都依赖于我们将在下面进行的少量设置:

  1. selected 使用更严格的类型,因此它只能包含有效的 Brennstoff 键,它看起来像:

    console.log(selected.some(key => Brennstoff[key] === Brennstoff.GAS)); // true
    console.log(selected.some(key => Brennstoff[key] === Brennstoff.OEL)); // false
    
  2. 选中作为string[],它看起来像:

    console.log(selected.some(key => isBrennstoffKey(key) && Brennstoff[key] === Brennstoff.GAS)); // true
    console.log(selected.some(key => isBrennstoffKey(key) && Brennstoff[key] === Brennstoff.OEL)); // false
    

验证 key

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

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

type BrennstoffKey = keyof typeof Brennstoff;

然后断言函数看起来像这样:

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。)

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

我发现我经常需要类型保护版本和断言版本;该组合将类似于:

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[] :

const selected: BrennstoffKey[] = [];

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

let key: string = /*...*/;
assertBrennstoffKey(key);
selected.push(key);

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

console.log(selected.some(key => Brennstoff[key] === Brennstoff.GAS)); // true
console.log(selected.some(key => Brennstoff[key] === Brennstoff.OEL)); // false

Playground link

selectedstring[]

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

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

console.log(selected.some(key => isBrennstoffKey(key) && Brennstoff[key] === Brennstoff.GAS)); // true
console.log(selected.some(key => isBrennstoffKey(key) && Brennstoff[key] === Brennstoff.OEL)); // false

Playground link

关于typescript - 枚举值数组 : check for Enum keys with Array. 包括?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69324847/

相关文章:

typescript - 为类对象赋值后为 "TypeError: XXXX is not a function"

javascript - 我如何检查 Angular 中的 Mobx 商店是否为空?

Typescript 无法解析 npm 包的定义文件

http - 错误 TS2346 : Supplied parameters do not match any signature of call target

json - 在类中使用 RxJs Subject 时 JSON.stringify 上的循环对象异常

node.js - 你能在 Typescript Compiler API 中引入 excludes/includes 选项吗?

javascript - 通过其他数组的索引过滤数组对象

css - Angular 4流畅的动画

typescript - 错误 : Set the 'experimentalDecorators' option in your 'tsconfig' or 'jsconfig' to remove this warning

javascript - 如何使用 TypeScript 为多个函数重用函数签名