打字稿对象序列化?

新手上路,请多包涵

是否有任何方法可以对 Typescript 对象进行 JSON 序列化/反序列化,以免丢失类型信息?简单 JSON.parse(JSON.stringify) 有太多警告。

或者我应该使用临时解决方案?

原文由 Nik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 285
2 个回答

使用接口获取强类型:

 // Creating
var foo:any = {};
foo.x = 3;
foo.y='123';

var jsonString = JSON.stringify(foo);
alert(jsonString);

// Reading
interface Bar{
    x:number;
    y?:string;
}

var baz:Bar = JSON.parse(jsonString);
alert(baz.y);

并在需要时使用类型断言“<>”。

原文由 basarat 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为处理此问题的更好方法是使用 Object.assign(但需要 ECMAScript 2015)。

给定一个类

class Pet {
    name: string;
    age: number;
    constructor(name?: string, age?: number) {
        this.name = name;
        this.age = age;
    }
    getDescription(): string {
        return "My pet " + this.name + " is " + this.age + " years old.";
    }
    static fromJSON(d: Object): Pet {
        return Object.assign(new Pet(), d);
    }
}

像这样序列化和反序列化……

 var p0 = new Pet("Fido", 5);
var s = JSON.stringify(p0);
var p1 = Pet.fromJSON(JSON.parse(s));
console.log(p1.getDescription());

要将此示例提升到一个新的水平,请考虑嵌套对象……

 class Type {
    kind: string;
    breed: string;
    constructor(kind?: string, breed?: string) {
        this.kind = kind;
        this.breed = breed;
    }
    static fromJSON(d: Object) {
        return Object.assign(new Type(), d);
    }
}
class Pet {
    name: string;
    age: number;
    type: Type;
    constructor(name?: string, age?: number) {
        this.name = name;
        this.age = age;
    }
    getDescription(): string {
        return "My pet " + this.name + " is " + this.age + " years old.";
    }
    getFullDescription(): string {
        return "My " + this.type.kind + ", a " + this.type.breed + ", is " + this.age + " years old.";
    }
    static fromJSON(d: Object): Pet {
        var o = Object.assign(new Pet(), d);
        o.type = Type.fromJSON(o['type']);
        return o;
    }
}

像这样序列化和反序列化……

 var q0 = new Pet("Fido", 5);
q0.type = new Type("dog", "Pomeranian");
var t = JSON.stringify(q0);
var q1 = Pet.fromJSON(JSON.parse(t));
console.log(q1.getFullDescription());

因此,与使用接口不同,这种方法保留了方法。

原文由 AQuirky 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题