以下代码可用于enum在TypeScript中创建:
enum e {
hello = 1,
world = 2
};
Run Code Online (Sandbox Code Playgroud)
并且可以通过以下方式访问这些值:
e.hello;
e.world;
Run Code Online (Sandbox Code Playgroud)
如何创建enum带字符串值?
enum e {
hello = "hello", // error: cannot convert string to e
world = "world" // error
};
Run Code Online (Sandbox Code Playgroud) 有没有办法让TypeScript枚举与JSON中的字符串兼容?
例如:
enum Type { NEW, OLD }
interface Thing { type: Type }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // false
Run Code Online (Sandbox Code Playgroud)
我想 thing.type == Type.NEW是真的.或者更具体地说,我希望我可以指定enum要定义为字符串的值,而不是数字.
我知道我可以使用,thing.type.toString() == Type[Type.NEW]但这很麻烦,似乎使枚举类型注释混乱和误导,这违背了它的目的.从技术上讲,JSON 不提供有效的枚举值,因此我不应该将属性键入枚举.
所以我现在正在做的是使用带有静态常量的字符串类型:
const Type = { NEW: "NEW", OLD: "OLD" }
interface Thing { type: string }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // true
Run Code Online (Sandbox Code Playgroud)
这让我得到了我想要的用法,但是类型注释string太宽泛且容易出错.
我有点惊讶JavaScript的超集没有基于字符串的枚举.我错过了什么吗?有没有不同的方法可以做到这一点?
更新TS 1.8
使用字符串文字类型是另一种选择(感谢@basaret),但要获得所需的类似枚举的用法(上图),它需要定义两次值:一次是字符串文字类型,一次是值(常量或命名空间):
type Type …Run Code Online (Sandbox Code Playgroud) 我想在typescript中有一组字符串枚举,所以我可以做一些事情,比如让用户从一组预定义的选项中进行选择.
我在这个答案中找到了一个很好的解决方案:如何在TypeScript中将字符串转换为枚举?
但是,这仅适用于单个单词...(基本上,上面允许您获取枚举名称值 - 并且不能在其中包含空格).
所以,进一步看,我发现这个人有一个解决方法:在typescript中基于字符串的枚举的解决方法
这将允许这样的事情工作:
export enum EventType {
Photoshoot = <any>"Photoshoot",
BookingMeeting = <any>"Booking Meeting",
PostShootMeeting = <any>"Post Shoot Meeting",
Purchase = <any>"Purchase",
Print = <any>"Print"
}
Run Code Online (Sandbox Code Playgroud)
唯一的回应基本上说这样做是不安全的.(但我应该说,它的工作-我可以输入事件类型.点 ......和Atom的编辑给我的5驼峰选项,从(保持事物的代码一致的选择),那么我可以用它来有字符串值吐出来给我的用户一个充满空间的体验,将来我可以更改枚举和不同的语言/选项措辞,而不会弄乱'代码'等等...
有一个更好的方法吗?我宁愿不"不安全" - 但我不知道其他任何方式.