@waltaki

Angular — Не работают стандартные значения переменой?

Здравствуйте.

Привожу пример:
есть у меня
export class NameSurName {
  name: string;
  surname: string = 'Иванов'
}

export class NameSurName Component implements OnInit {
  private nameSurName: NameSurName;
  constructor(private http: HttpClient) {}
}

ngOnInit() {
  this.http.get('api/namesurname').subscribe((resp) => {
    this.nameSurName = resp.data // {name: 'Вася'} 
  })
}

Если ко мне, с api приходит только поле name, то surname undefined...((
Почему так? Как решить?
  • Вопрос задан
  • 68 просмотров
Решения вопроса 1
@PavelPikat
HttpClient не создает классы, вам нужно вызывать конструктор вручную, например через map

this.http.get('api/namesurname')
.pipe(
    map((resp) => resp.data.map(item => new NameSurName(item)),
}
.subscribe((resp) => {
    this.nameSurName = resp.data // {name: 'Вася'} 
  })

export class NameSurName {
  name: string;
  surname: string = 'Иванов'

constructor(props: Partial<NameSurName >) {
   Object.assign(this, props);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
search
@search
мама говорит что я особенный
Только ручками, тайпскрипт за вас это чинить не будет.

// Класс здесь не нужен. Старайтесь предпочитать интерфейсы классам если у объекта нет методов
export interface NameSurName {
  name: string;
  surname: string;
}

...

this.nameSurName = {
  name: '',
  surename: 'Иванов',
  ...resp.data
}


На вопрос "почему так" ответ: тайпскрит не добавляет в код никакой магии. Конечный код скомпилированный из тайпскрипта выглядет в JS почти так же как и с тайпскриптом, только без типов. Короче, TS не занимается преобразованием типов за вас.

Вот есть официальный playground от создателей. Можно ради интереса иногда попроверять что получится из вашего TS кода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы