有什么方法可以让TypeScript枚举与JSON中的字符串兼容?
例如:
enum Type { NEW, OLD }
interface Thing { type: Type }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // false
我 想 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
这为我提供了我想要的用法,但是类型注释string
太宽泛并且容易出错。
我很惊讶JavaScript的超集没有基于字符串的枚举。我想念什么吗?有其他方法可以做到吗?
更新TS 1.8
使用字符串文字类型是另一种选择(感谢@basaret),但是要获得所需的类似枚举的用法(上面),它需要
两次 定义您的值:一次是字符串文字类型,一次是值(常量或名称空间):
type Type = "NEW" | "OLD";
const Type = {
NEW: "NEW" as Type,
OLD: "OLD" as Type
}
interface Thing { type: Type }
let thing:Thing = JSON.parse(`{"type": "NEW"}`);
alert(thing.type === Type.NEW); // true
这行得通,但要花很多时间,足以让我大部分时间不使用它。目前,我希望这项提案string enums
最终能制定出路线图。
更新TS 2.1
新的keyof
类型查找允许从const或名称空间的键生成字符串文字类型,这使定义 少了 一些冗余:
namespace Type {
export const OLD = "OLD";
export const NEW = "NEW";
}
type Type = keyof typeof Type;
interface Thing { type: Type }
const thing: Thing = JSON.parse('{"type": "NEW"}');
thing.type == Type.NEW // true
更新TS 2.4
TypeScript
2.4添加了对字符串枚举的支持!上面的示例变为:
enum Type {
OLD = "OLD",
NEW = "NEW"
}
interface Thing { type: Type }
const thing: Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW) // true
这看起来 几乎是 完美的,但是仍然有些心痛:
OLD = "OLD"
,并且没有验证您没有错字,例如NEW = "MEW"
…这已经在真实代码中咬住了我。 enum Color { RED = "RED", BLUE = "BLUE", GREEN = "GREEN" }
type ColorMap = { [P in Color]: number; }
declare const color: Color;
declare const map: ColorMap;
map[color] // Error: Element implicitly has an 'any' type because type 'ColorMap' has no index signature.
const red: Color = "RED"; // Type '"RED"' is not assignable to type 'Color'.
const blue: Color = "BLUE" as "RED" | "BLUE" | "GREEN"; // Error: Type '"RED" | "BLUE" | "GREEN"' is not assignable to type 'Color'.
enum Color
用字符串文字类型替换的等效代码可以正常工作…
是的,我认为我对此有强迫症,我只想要我的完美JS枚举。:)
如果您在2.4版本之前使用Typescript,则可以通过将枚举值转换为来使用枚举来实现any
。
首次实施的示例
enum Type {
NEW = <any>"NEW",
OLD = <any>"OLD",
}
interface Thing { type: Type }
let thing:Thing = JSON.parse('{"type": "NEW"}');
alert(thing.type == Type.NEW); // true
Typescript
2.4已经内置了对字符串枚举的支持
,因此,any
不再需要强制转换为,而无需使用,就可以实现它String Literal Union Type
,这对于验证和自动完成是可以的,但对于可读性和重构则不太好,具体取决于使用场景。
是否有任何方法使TypeScript枚举与JSON中的字符串兼容? 例如: 我想要是真的。或者更具体地说,我希望可以将值指定为字符串,而不是数字。 我知道我可以使用但这很麻烦,而且似乎会使枚举类型注释混淆和误导,从而破坏了它的用途。从技术上讲,JSON没有提供有效的枚举值,所以我不应该在枚举中键入属性。 所以我现在做的是使用带有静态常量的字符串类型: 这就得到了我想要的用法,但是类型注释太宽泛了,
问题内容: 有没有一种方法可以将Typescript中的字符串解析为JSON。 示例:在JS中,我们可以使用。Typescript中有类似的功能吗? 我有一个JSON对象字符串,如下所示: 问题答案: Typescript是javascript(的超集),因此您可以像在javascript中那样使用它: 只有在打字稿中,您才能对结果对象进行打字: (操场上的代码)
在typescript中有没有一种方法可以将字符串解析为JSON。 示例:在JS中,我们可以使用。在Typescript中有类似的功能吗? 我有一个JSON对象字符串,如下所示:
因此,进一步寻找,我发现这个人有一个解决方案:typescript中基于字符串的枚举的解决方案 这将允许像这样的东西工作: 唯一的回应基本上是说这样做是不安全的。(但我应该说,它确实起作用了--我可以键入eventtype.dot...Atom editor给了我5个大小写选项可供选择(保持代码中的内容一致),然后我可以使用它将字符串值吐出来,给我的用户一个很好的填充空间的体验,将来我可以更改枚举
我有以下JSON字符串: 我只想要和。我试过这样的方法: 但我得到了以下错误: 我只使用过几次JSON。有人能帮我吗? 对我来说最好的例子是这样的,我在另一个例子中做过: 可能吗? 现在我已经做到了: 我试着这样做: 然后: 但现在当我做一个Prtinout时,我会得到和以前一样的错误:
问题内容: 而不是从json字符串中使用$ .parseJSON,我需要获取对象并将其存储在变量中作为代表json的字符串。 (我正在处理的库期望使用格式错误的json类型,因此我需要弄乱它才能使其正常工作。) 最好的方法是什么? 问题答案: 编辑: 您应该使用Douglas Crockford的json2.js库,而不是实现下面的代码。它提供了一些额外的功能以及更好/更旧的浏览器支持。 从以下位