我从远程REST服务器读取了一个JSON对象。这个JSON对象具有typescript类的所有属性(根据设计)。我如何转换收到的JSON对象的类型var?

我不想填充一个typescript变量(即有一个构造函数,以这个JSON对象)。它很大,在子对象和属性之间复制所有内容将花费大量时间。

更新:你可以将它转换为typescript接口!


当前回答

目前还没有自动检查从服务器接收到的JSON对象是否具有预期的(读取是否符合)typescript的接口属性。但是你可以使用用户定义的类型保护

考虑以下接口和一个愚蠢的json对象(它可以是任何类型):

interface MyInterface {
    key: string;
 }

const json: object = { "key": "value" }

三种可能的方法:

A.类型断言或放置在变量之后的简单静态强制转换

const myObject: MyInterface = json as MyInterface;

B.简单的静态铸造,前变量和菱形之间

const myObject: MyInterface = <MyInterface>json;

C.高级动态转换,你检查自己的对象结构

function isMyInterface(json: any): json is MyInterface {
    // silly condition to consider json as conform for MyInterface
    return typeof json.key === "string";
}

if (isMyInterface(json)) {
    console.log(json.key)
}
else {
        throw new Error(`Expected MyInterface, got '${json}'.`);
}

你可以玩一下这个例子

注意,这里的困难在于编写isMyInterface函数。我希望TS迟早会添加一个装饰器,将复杂的类型导出到运行时,并让运行时在需要时检查对象的结构。现在,您可以使用json模式验证器,其目的与此大致相同,也可以使用此运行时类型检查函数生成器

其他回答

您可以创建自己类型的接口(SomeType)并在其中强制转换对象。

const typedObject: SomeType = <SomeType> responseObject;

使用“as”声明:

const data = JSON.parse(response.data) as MyClass;

我认为json2typescript是一个不错的选择 https://www.npmjs.com/package/json2typescript

你可以用一个带有注释的简单模型类将json转换为Class模型

用于工程

在TypeScript中,你可以使用接口和泛型进行类型断言,如下所示:

var json = Utilities.JSONLoader.loadFromFile("../docs/location_map.json");
var locations: Array<ILocationMap> = JSON.parse(json).location;

其中ILocationMap描述了数据的形状。这种方法的优点是JSON可以包含更多属性,但形状满足接口的条件。

但是,这不会添加类实例方法。

https://jvilk.com/MakeTypes/

您可以使用该网站为您生成代理。它生成一个类,可以解析和验证输入的JSON对象。