打字稿从json创建一个类

Posted

技术标签:

【中文标题】打字稿从json创建一个类【英文标题】:Typescript create a class from json 【发布时间】:2016-03-04 13:27:17 【问题描述】:

我有一个接口 IPost 和一个类 Post,我想从 json 数据创建 Post,在 Post 构造函数中我得到接口 IPost 匹配的 json 响应.

我的意思是IPost界面是由这个很棒的工具json2ts生成的

json2ts : 从 JSON 生成 TypeScript 接口

import  IPost, Title, Guid, Content, Excerpt, Embedded, Links  from './Ipost.ts';

export class Post implements IPost 
    Id: number;
    Date: string;
    DateGmt: string;
    Guid: Guid;
    Modified: string;
    ModifiedGmt: string;
    Slug: string;
    Type: string;
    Link: string;
    Title: Title;
    Content: Content;
    Excerpt: Excerpt;
    Author: number;
    FeaturedImage: number;
    CommentStatus: string;
    PingStatus: string;
    Sticky: boolean;
    Format: string;
    Links: Links;
    Embedded: Embedded;

    constructor(json: any) 
        var self = this;
        json.subscribe(res => 
            var jsonRes: any = res.json();
            self = jsonRes;        //something like this
        );
    

我可以直接将类Post 分配给json,因为json 被描述为与Post 类相同!

除了将每个属性从 json 分配给其对等方之外,还有其他方法吗?

【问题讨论】:

【参考方案1】:

就像使用 javascript 一样,您必须使用标准循环遍历每个值,并将该值分配给 self。在您的情况下分配给 self,只需将 self 的值更改为 json 值,它不会对 this 本身进行任何更改。

json.subscribe(res => 
    let json = res.json();
    for (var prop in obj) 
        if( obj.hasOwnProperty( prop ) ) 
            this[prop] = obj[prop];
        
    
);

注意:=>this 绑定到外部上下文(例如您正在使用的类)到this,因此您不需要中间的self 变量。

【讨论】:

let obj = res.json() 而不是让 json 我的界面中有嵌套属性,比如post.embedded.title.rendered,这对所有人都有效还是我应该为此创建嵌套的for循环? 如果那些嵌套的属性是其他类的实例,那么你就必须做不同的事了。

以上是关于打字稿从json创建一个类的主要内容,如果未能解决你的问题,请参考以下文章

打字稿从父ID中获取所有子孙ID的数组

打字稿从元组/数组值派生联合类型

打字稿类嵌套json猫

“A型与B型没有共同特性”是什么意思?

创建一个返回反应组件类的打字稿函数

在打字稿Angular 5中导入json文件