[英]typescript string enum, reverse mapping equivalent
我有一個字符串枚舉,需要檢查文字是否屬於枚舉。 反向映射不適用於字符串枚舉。
假如
enum Animals{
cat="c";
dog="d";
fish="f";
}
let animal= "d";
動物是動物的一員嗎? 考慮枚舉對象,您可以迭代並檢查:
function inEnum(what, enu):boolean{
for (let item in enu){
if (enu[item]==what){
return true;
}
}
return false;
}
有沒有更好的方法?,這種技術可能會在未來的版本中破裂嗎?
ts-enum-util
( github , npm )lib支持使用運行時驗證驗證枚舉名稱/值和類型安全值 - >鍵和鍵 - >值查找以及拋出錯誤或返回默認值的選項值。
例子:
import {$enum} from "ts-enum-util";
enum Animals{
cat="c";
dog="d";
fish="f";
}
let animal= "d";
// true
const isAnimal = $enum(Animals).isValue(animal);
// the "isValue" method is a custom type guard
if ($enum(Animals).isValue(animal)) {
// type of "animal" in here is "Animals" instead of "string"
}
// type: ("cat" | "dog" | "fish")
// value: "dog"
const name = $enum(Animals).getKeyOrThrow(animal);
在直接回答問題之前,值得一提的是TypeScript支持Union Type ,它通常比字符串enum
更適合這種類型的東西。 例:
type Animal = 'cat' | 'dog' | 'fish';
let myAnimal1: Animal = 'cat'; // ok
let myAnimal2: Animal = 'buttercup'; // compile-time error "'buttercup' is not assignable to type Animal"
這種方法的好處是讓您在編譯時知道值是否對Animals
類型有效。
現在,為了回答關於在運行時確定值是否在enum
in
,我們可以使用in
運算符來重構inEnum
函數,如下所示:
let inEnum = (val, enumObj) => val in enumObj;
inEnum("d", Animals) //evaluates to true
inEnum("z", Animals) //evaluates to false
甚至完全放棄函數調用,直接使用in
運算符:
"d" in Animals //evaluates to true
"z" in Animals //evaluates to false
但是,沒有任何跡象表明你自己的方法在未來的版本中會破壞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.