在typescript中使用带有数字变量名的json

时间:2017-03-28 15:42:53

标签: json typescript deserialization swagger

我从swagger中消耗了JSON,当我得到响应时,我得到了一堆变量,即响应代码,即数字。 JSON的相关部分如下所示。

"responses": {
  "200": {
    "description": "OK"
  },
  "404": {
    "description": "not found"
  },
  "503": {
    "description": "Problem with external dependency"
  }
}

如何将其反序列化为Typescript对象,还是应该使用服务来使用它并处理它,然后再将一些更易于处理的东西交给Typescript?我目前的想法是在javascript中处理它,然后吐出一些在打字稿中更容易消费的东西;但是在潜入那个兔子洞之前(好吧,不是那么糟糕,我可以看到底部)我想我是否有更好的解决方案。

1 个答案:

答案 0 :(得分:1)

TypeScript仅在编译时存在。在运行时,一切都是普通的JavaScript。

As(de)序列化在运行时发生,你会将它反序​​列化为JavaScript对象,但我认为你的意思是“是否有可能创建一个描述这个传入对象的TypeScript类型定义?”。

此外,属性名称不是数字,它们是碰巧包含数字的字符串。当将类型定义创建为字符串并且数字是两种不同的类型时,这是一个重要的区别。

第一步是定义Response对象:

interface IResponse {
  description: string;
}

然后,有两种方法可用于定义Responses对象。如果事先知道属性名称,则可以使用第一个,第二个可以以更通用的方式使用,以支持给定类型的任何属性名称。

已知名称

interface IKnownResponses {
  "200": IResponse;
  "300"?: IResponse;
  "400": IResponse;
}

这定义了一个必须具有名为“200”和“400”的属性的接口,并且可以选择具有名为“300”的属性。

“300”是optional(搜索“可选属性”标题),因为它的属性定义有?在它。

动态名称

interface IDynamicResponses {
    [responseCode: string]: IResponse;
}

此接口表示任何字符串都可以用作键/属性名称,但该属性必须包含IResponse

这是indexer definition(查找标题为“可索引类型”的部分)。

实施例

可以在以下示例代码中看到这些方法:

interface IResponse {
  description: string;
}

interface IKnownResponses {
  "200": IResponse;
  "300"?: IResponse;
  "400": IResponse;
}

interface IDynamicResponses {
    [responseCode: string]: IResponse;
}

let knownResponses: IKnownResponses = {
    "200": {
    description: "foo"
  },
  "400": {
    description: "bar"
  }
};

let dynamicResponses: IDynamicResponses = {
    "200": {
    description: "foo"
  },
  "400": {
    description: "bar"
  },
  "401": {
    description: "baz"
  }
};

console.log(staticResponses["200"].description);
console.log(knownResponses["401"].description);

https://jsfiddle.net/L8dpomL8/3/

不幸的是,JSFiddle不是一个非常好的TypeScript IDE,因此很难显示正在使用的类型信息,但是如果你把这个代码放在首选的IDE中,你应该能够试验它并找出它的位置。打字会帮助你,以及他们失败的地方。