我有以下TypeScript Enum:
export enum Brennstoff {
OEL = "Öl",
GAS = "Gas",
SOLAR = "Solar",
}
我有一个Brennstoff
的多选输入,它返回一个键数组:
const selected = ["GAS", "SOLAR"]
如何检查数组是否包含条目?
selected.includes(Brennstoff.GAS)
操场上联系
因为Brennstoff.GAS
返回Gas
,所以它查找值,但是我需要查找键。
如何在TypeScript中做到这一点?
简介&TL;博士
有两个解决方案,它们都依赖于我们将在下面介绍的一些设置:
-
使用更严格的
selected
类型,因此它只能包含有效的Brennstoff
密钥,它看起来像:console.log(selected.some(key => Brennstoff[key] === Brennstoff.GAS)); // true console.log(selected.some(key => Brennstoff[key] === Brennstoff.OEL)); // false
-
保持
selected
作为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
确认键两种解决方案都涉及验证字符串是否为有效的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
操场上联系