Преобразование JSON в интерфейс Typescript, включая метод Date - PullRequest
0 голосов
/ 05 февраля 2019

В Angular 7 у меня есть следующая модель сообщения:

export interface PostModel {
  id: number;
  created: Date;
  published: boolean;
  title: string; 
}

И у меня есть следующий метод обслуживания Angular для получения сообщений:

public getPosts(): Observable<PostModel[]> {

  return this.httpClient.get<PostModel[]>(url).pipe(

    map((post: PostModel)) => {

      return {
        id: post.id, 
        created: new Date(post.created),
        published: post.published,
        title: post.title
      };

    })

  };

Я преобразовываю ответ API вPostModel вручную ...

Это потому, что тип created имеет тип Date, а Angular не преобразует его автоматически.

Я хотел бы повторно использовать код отображения в различных частях моего кода:

map((post: PostModel)) => return mapPostFromJson(post));

Я мог бы преобразовать PostModel в класс и mapPostFromJson в качестве его метода.

Но я бы предпочел, чтобы PostModel оставался интерфейсом.

Как я могу это сделать?

Обновление

Моя проблема заключается в том, как создать метод mapPostFromJson.Я пытался:

mapPostFromJson(data: any) : PostModel {

  return map((post: PostModel) => {

    return { 
      id: post.id, 
      created: new Date(post.created),
      published: post.published,
      title: post.title
    };

  });

}

Эта функция не компилируется ...

Я не уверен, как использовать карту вне трубы ...

1 Ответ

0 голосов
/ 05 февраля 2019

Я не уверен, что правильно понял ваш вопрос, но сработает ли эта функция отображения?

mapPostFromJson(data: any): PostModel {
    return { 
        id: data.id, 
        created: new Date(data.created),
        published: data.published,
        title: data.title
    };
}

В противном случае, используя функциональные принципы, вы могли бы сделать более общее решение, определив общие функции, которые вы можетеповторно использовать для построения ваших картографов:

// This function takes a structure of functions, and applies
// them to some data, returning a structure of the results
const mapper = functions => json => Object.entries(json)
    .map(([k, val]) => ({ [k]: (functions[k] || (x => x))(val) }))
    .reduce((acc, o) => Object.assign(acc, o), { });

Затем вы можете легко создать картограф и вызвать его в вашем JSON:

// create a mapper that passes all properties
// but transforms 'created' to a date
const mapPostFromJson = mapper({
    created: x => new Date(x)
});

const post = mapPostFromJson(jsonPost);

Используя этот картограф, все свойства JSON будут проходить, ноСозданное поле будет преобразовано в дату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...