我有以下TypeScript Enum:
export enum Brennstoff {
OEL = "Öl",
GAS = "Gas",
SOLAR = "Solar",
}
我有一个多选择的Brennstoff
输入,它返回一个键数组:
const selected = ["GAS", "SOLAR"]
如何检查数组是否包含条目?以下内容不起作用
selected.includes(Brennstoff.GAS)
因为Brennstoff.GAS
返回Gas
,所以它会查找值,但是我需要查找键。
我如何在TypeScript中做到这一点?
发布于 2021-09-25 15:02:47
导言& TL;DR
为您提供两种解决方案,这两种解决方案都依赖于一小部分我们将在下面介绍的设置:
selected
使用更严格的类型,因此它只能包含有效的Brennstoff
键,如下所示:
Console.log(key => Brennstoffkey === Brennstoff.GAS);// true console.log(selected.some(key => Brennstoffkey === Brennstoff.OEL));// falseselected
保持为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
,但是您可能会发现有一个别名是有用的:
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
selected
是string[]
如果您希望将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
https://stackoverflow.com/questions/69324847
复制相似问题