我从swagger中消耗了JSON,当我得到响应时,我得到了一堆变量,即响应代码,即数字。 JSON的相关部分如下所示。
"responses": {
"200": {
"description": "OK"
},
"404": {
"description": "not found"
},
"503": {
"description": "Problem with external dependency"
}
}
如何将其反序列化为Typescript对象,还是应该使用服务来使用它并处理它,然后再将一些更易于处理的东西交给Typescript?我目前的想法是在javascript中处理它,然后吐出一些在打字稿中更容易消费的东西;但是在潜入那个兔子洞之前(好吧,不是那么糟糕,我可以看到底部)我想我是否有更好的解决方案。
答案 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中,你应该能够试验它并找出它的位置。打字会帮助你,以及他们失败的地方。