首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >类型记录字符串枚举,反向映射等效

类型记录字符串枚举,反向映射等效
EN

Stack Overflow用户
提问于 2018-02-16 13:33:14
回答 2查看 2.5K关注 0票数 1

我有一个字符串枚举,需要检查文字是否与枚举相关。反向映射不适用于字符串枚举。

假想

代码语言:javascript
运行
复制
enum Animals{
    cat="c";
    dog="d";
    fish="f";
}

let animal= "d";

动物是动物的成员吗?考虑到枚举是一个对象,您可以迭代并检查:

代码语言:javascript
运行
复制
function inEnum(what, enu):boolean{
    for (let item in enu){
        if (enu[item]==what){
            return true;
        }
    }
    return false;
}

有没有更好的方法?,这种技术在未来的版本中会有突破吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-20 12:31:17

在直接回答问题之前,值得一提的是,TypeScript支持联合类型,这通常比字符串enum更适合这类事情。示例:

代码语言:javascript
运行
复制
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操作符来重构inEnum函数,如下所示:

代码语言:javascript
运行
复制
let inEnum = (val, enumObj) => val in enumObj;

inEnum("d", Animals) //evaluates to true
inEnum("z", Animals) //evaluates to false

甚至完全放弃函数调用,直接使用in操作符:

代码语言:javascript
运行
复制
"d" in Animals //evaluates to true
"z" in Animals //evaluates to false

但是,没有任何迹象表明您自己的方法在将来的版本中会被打破。

票数 1
EN

Stack Overflow用户

发布于 2018-02-24 05:51:12

ts-enum-util (githubnpm)库支持枚举名称/值和类型安全值->key和key->value的验证,运行时验证以及抛出错误或返回默认值的选项。

示例:

代码语言:javascript
运行
复制
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); 
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48827943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档