当前位置: 首页 > 面试题库 >

JSON字符串的Typescript`enum`

公良鸿风
2023-03-14
问题内容

有什么方法可以让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库,而不是实现下面的代码。它提供了一些额外的功能以及更好/更旧的浏览器支持。 从以下位