typescript анализирует json с классом и интерфейсом

Я пытаюсь сделать так, чтобы класс Post содержал такие атрибуты сообщения, как "id, title, content... и т. д.

Я хочу инициализировать класс из ответа JSON. Я использую angular-http для получения JSON в машинописном тексте.

в APP.TS:

class AppComponent {

  result: { [key: string]: string; };
  
  map: Map<Object,Object>;
  
  constructor(http: Http) {
    http.get('http://localhost/wptest/wp-json/wp/v2/posts').subscribe(res => {
      
      this.result = <any>res.json();
      this.map = <any>res.json();
      
      console.log(this.result);
      console.log(this.map);     
    });
  }
}

примечание: я все еще не понимаю, какой тип подходит для моего JSON. Я читал, что typescript еще не поддерживает Map, однако здесь он работает как result: {[key:string]: string; };

Я попытался найти в stackoverflow, я нашел этот вопрос как преобразовать объект json в машинописный текст, ответ не имеет ничего общего с машинописным текстом.

в другом вопросе Можно ли создать тип TypeScript и использовать его, когда AJAX возвращает данные JSON?

ответ говорит о создании интерфейсов в машинописном тексте. (чего я не совсем понял).

Я также нашел этот сайт для json2ts, генерирующего машинописные интерфейсы из JSON, поэтому я попробовал свой json и получил следующее:

declare module namespace {

    export interface Guid {
        rendered: string;
    }

    export interface Title {
        rendered: string;
    }

    export interface Content {
        rendered: string;
    }

    export interface Excerpt {
        rendered: string;
    }

    export interface Self {
        href: string;
    }

    export interface Collection {
        href: string;
    }

    export interface Author {
        embeddable: boolean;
        href: string;
    }

    export interface Reply {
        embeddable: boolean;
        href: string;
    }

    export interface VersionHistory {
        href: string;
    }

    export interface Links {
        self: Self[];
        collection: Collection[];
        author: Author[];
        replies: Reply[];
    }

    export interface RootObject {
        id: number;
        date: Date;
        guid: Guid;
        modified: Date;
        modified_gmt: Date;
        slug: string;
        type: string;
        link: string;
        title: Title;
        content: Content;
        excerpt: Excerpt;
        author: number;
        featured_image: number;
        comment_status: string;
        ping_status: string;
        sticky: boolean;
        format: string;
        _links: Links;
    }
}

Теперь у меня есть машинописный интерфейс для моего JSON, но я не знаю, что делать дальше!

Вопрос. Является ли это правильным способом преобразования JSON в объект класса в машинописном тексте? если да, то каков следующий шаг, чтобы инициализировать класс данными?


person Murhaf Sousli    schedule 20.11.2015    source источник


Ответы (1)


Вам определенно следует использовать интерфейсы для описания вашего DTO (объекта передачи данных). Похоже, что json2ts хорошо описал вашу структуру JSON. Теперь, поскольку служба http создала объект для вас, вам не нужно создавать новый... вам нужно только привести его к вашему интерфейсу, например, в следующих строках:

class AppComponent {
  dataFromServer : RootObject;

  http.get('http://localhost/wptest/wp-json/wp/v2/posts').subscribe(res => {
    this.dataFromServer = <RootObject>res.json();
  });
}

С этого момента TypeScript защитит вас от любых ошибок при попытке доступа к любым данным, пришедшим с сервера. Например:

this.dataFromServer.age = 45; // Error: age doesn't exist in the RootObject interface
this.id = "Hello"; // Error, id was is a number, and you try to put string into it.
this.id = 100; // will be just fine.
person gilamran    schedule 20.11.2015
comment
это сработало, поэтому нет необходимости создавать собственный класс для интерфейса? - person Murhaf Sousli; 20.11.2015
comment
Вы не являетесь создателем этого объекта, не занимайтесь. Если вы не хотите начать выполнять действия (функции) с этим объектом - person gilamran; 20.11.2015
comment
Но что, если я не знаю, что будет содержать JSON? Как я могу создавать интерфейсы для объектов, содержимое которых мне неизвестно? - person Kokodoko; 12.06.2016
comment
@Kokodoko Вы нашли ответ на этот вопрос? - person CKA; 06.09.2017
comment
Помните, что TypeScript предназначен только для разработки, и ответ вашего сервера будет предоставлен во время выполнения... это означает, что вы можете помочь себе, приведя заданный JSON. Разве не обещано, что сервер вернет то, что вы предполагаете. - person gilamran; 06.09.2017
comment
Если вы действительно не знаете, какой JSON собирается вернуть сервер, вам просто нужно сначала ввести его как :any, а затем проверить, существуют ли свойства в объекте json. После этого вы можете привести его к соответствующему типу. Что-то вроде if(obj.actor) mytypedobject = <actor>obj. - person Kokodoko; 07.09.2017
comment
Я бы также использовал пакет typescript-json-schema для создания схемы json для определенного интерфейса, а затем вы сначала проверяете данные, полученные с сервера, а затем вы можете безопасно преобразовать их, зная, что они находятся в правильной структуре. - person Max; 01.04.2020