Преобразование значения json в значение перечисления - PullRequest
1 голос
/ 17 июня 2020

Мне нравится преобразовывать строковое значение json в enum, чтобы оно могло отображать / отображать настраиваемую строку на странице html. сообщение об ошибке: Введите '{id: number; имя: строка; статус: строка; } [] 'не может быть назначен типу' Status [] '

У меня есть запись json вроде этой:

{ id: 1, name: 'Some name', status: 'STATUS01' },

status.enum.ts

export enum Status {
  'STATUS01' = 'Operational',
  'STATUS02' = 'Some other status'
}

Это перечисление используется в модели

import { Status } from './status.enum';

export class ServiceState {
  id: number;
  name: string;
  status: Status;
}

В сервисе есть функция для получения всех статусов (фиктивные данные):

getStatuses(): Observable<ServiceState[]> {
    const response = [
      { id: 1, name: 'One', status: 'STATUS01' },
      { id: 2, name: 'Two', status: 'STATUS01' },
      { id: 3, name: 'OneTwo', status: 'STATUS02' },}
    ];
    return of(response);
  }

возврат выдает ошибку

Ответы [ 2 ]

1 голос
/ 17 июня 2020

Фактически вы должны использовать значение перечисления:

export enum Status {
  STATUS01 = 'Operational',
  STATUS02 = 'Some other status'
}

const response = [
  { id: 1, name: 'One', status: Status.STATUS01 },
  { id: 2, name: 'Two', status: Status.STATUS01 },
  { id: 3, name: 'OneTwo', status: Status.STATUS02 },
  // ...
];

Если вы хотите сопоставить значения из перечисления:

getStatuses(): Observable<ServiceState[]> {
  const response = [
    { id: 1, name: 'One', status: 'STATUS01' },
    { id: 2, name: 'Two', status: 'STATUS01' },
    { id: 3, name: 'OneTwo', status: 'STATUS02' },
  ];

  return of(response).pipe(
    map((states) => states.map((state) => ({
      ...state,
      status: Status[state.status]
    } as ServiceState)
  );
}
0 голосов
/ 17 июня 2020

Я все еще не понимаю ваш вопрос, но вам, возможно, придется сопоставить ответ от API, чтобы он соответствовал вашему типу класса.

Сервис

public getStatuses(): Observable<ServiceState[]> {
  return this.http.get('url').pipe(
    map(data => data.forEach(item => {
      item.status = Status[item.status];
    }))
  );
}

Если вы Если класс используется только для утверждения типа, тогда достаточно простого интерфейса.

...