簡體   English   中英

typescript字符串枚舉,反向映射等價

[英]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-utilgithubnpm )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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM