не в состоянии понять, как Angular отображает JSON на объект - PullRequest
0 голосов
/ 02 июля 2018

Я отправлял json клиенту Angular

{
result:"success"
additional-info:"something"
}

Я отображал выше json для объекта следующего класса

export class ServerResponseAPI{ //should this be an interface?
  constructor ( public result:string,
               public additionalInformation:string){
  }
} 

например. let jsonResponse:ServerResponseAPI = res.body

Когда я попытался получить доступ к ключу jsonResponse.additionalInformation, я получил сообщение об ошибке undefined. Я полагаю, это произошло потому, что javascript преобразовал json в object с ключами result и additional-info (давайте назовем его jsonObject и когда этот объект был назначен объекту типа ServerResponseAPI (давайте вызовем его apiObject), additional-info не отображается на additionalInformation из-за разных имен. Я исправил код следующим образом, и он заработал

export class ServerResponseAPI{
  'additional-info':string;
  constructor ( public result:string,
               public additionalInformation:string){
    this['additional-info'] = additionalInformation;
  }
}

Но я не очень хорошо понимаю, почему исходный код не работал, а последний работал. Если Angular создает apiObject с двумя свойствами - result и additionalInformation и замечает, что jsonObject не имеет свойства additionalInformation, он сохраняет additionalInformation undefined. Тогда почему this['additional-info']=additionalInformation также не делает additional-info undefined?

1 Ответ

0 голосов
/ 02 июля 2018

Насколько я знаю об Angular и Typescript, Angular анализирует ваш JSON для объекта, а Typescript выполняет проверку.

Дело в том, что когда вы работаете с классами, вам нужно создавать новые экземпляры с ключевым словом new.

Интерфейсы в Typescript полезны для проверки типов во время кодирования (они не добавляют дополнительный код к вашему скомпилированному коду), и они идеально подходят для этого сценария, который предоставляет способ «определения» структуры объект, который будет возвращен из вашего API.

Вот как используется интерфейс:

let jsonResponse:ServerResponseAPI = res.body

Вот как используется класс:

let jsonResponse = new ServerResponseAPI(res.body.result, res.body['additional-info'])

Использование интерфейса позволяет сопоставлять типы непосредственно с объекта.

Надеюсь, это поможет

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