在Typescript中将字符串数组转换为枚举类型

19

我正在尝试使用TypeScript。

假设我有一个像这样的object

let colors = {
    RED: "r",
    GREEN: "g",
    BLUE: "b"
}

现在我想将这个内容转换成一个“枚举”类型。
enum Colors = {
    RED = "r",
    GREEN = "g",
    BLUE = "b"
}

更新:

我需要对 colors 对象生成的 typings 进行修改。如果我往 colors 对象中添加了另一个 key,那么它应该被包含在 typings 中。

如果我执行以下操作:

colors['YELLOW'] = "y"

那么生成的typings应该是这样的

declare enum colors {
    RED = "r",
    GREEN = "g",
    BLUE = "b",
    YELLOW = "y"
}

相反,生成的类型是
declare const colors {
     [x: string]: string        
}

我该如何实现这个目标?

你有什么使用意图?不要认为你可以基于对象字面量创建实际的枚举类型,但是你可以创建一个非常类似行为的对象。 - Titian Cernicova-Dragomir
你可以做相反的事情 - 将 enum 转换为对象。 - Aleksey L.
@TitianCernicova-Dragomir 我已经更新了问题,说明我实际想要实现什么。 - besrabasant
4
我期望得到一个数组,而不是一个对象。你的问题标题与正文完全无关。这将是一个数组:["red", "blue", "green"],我希望它被转换为 enum Color { red, blue, green } - Soldeplata Saketos
1个回答

4
枚举 « 枚举允许我们定义一组命名常量。使用枚举可以更容易地记录意图,或创建一组不同的情况。TypeScript 提供了基于数字和字符串的枚举。

TypeScript 2.4+ 字符串枚举 - 在 TypeScript 2.4 之前,TypeScript 只支持基于数字的枚举,在这种情况下,只需将字符串文字转换为any,使用 2.4+ 后就不再需要了。

enum Colors {
    RED = <any>"R",
    GREEN = <any>"G",
    BLUE = <any>"B",
}

JavaScript 标准风格

var Colors;
(function (Colors) {
    Colors["RED"] = "r";
    Colors["GREEN"] = "g";
    Colors["BLUE"] = "b";
})(Colors || (Colors = {}));

在 TypeScript Fiddle fiddlesalad 上进行检查,typescriptlang


以下实用函数可以帮助您从字符串列表创建一个 K:V
function strEnum<T extends string>(o: Array<T>): {[K in T]: K} {
  return o.reduce((res, key) => {
    res[key] = key;
    return res;
  }, Object.create(null));
}
let dynamicArrayJSON = [ 'RED', 'BLUE', 'GREEN' ]
const Colors = strEnum( dynamicArrayJSON )

@see


我想将上述的“object”类型转换为“enum”类型。 - besrabasant
你想要将静态JSON对象或动态JSON对象转换为枚举类型。 - Yash
动态的 JSON 对象 - besrabasant
请查看实用函数,它可能会对您有所帮助! - Yash

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接