Как привести к переменным угловой модели в httpClient / Observable / Map или что-то еще? - PullRequest
0 голосов
/ 12 декабря 2018

, потому что я новичок в Angular / Typescript, у меня все еще есть некоторые фундаментальные вопросы, но я не мог найти подходящий ответ.Как я могу получить или привести правильные типы значений?

Я определил простую модель:

export class Message {
    ID:                 number;
    mode:               string;
    senderID:           number;
    receiverID:         number;
    marked:             boolean;
    subject:            string;
}

Теперь я получаю данные с сервера через службу message.service, например:

getMessages(): Observable<Message[]> {
    return this.restService.get('/message/list/' + this.owner)
}

и в моем компоненте я читаю значения через:

this.messageService.getMessages().subscribe((messages:Message[]) => {
    this.objectlist = messages
}

Что мне нужно, и я ожидаю, это реальные типы данных элементов сообщения, но все имеет Строка .Почему нет логических и чисел ?

Я также играл с pipe () и map (), но я не могу выполнить преобразование типов.

Что я делаю не так?Я надеюсь, что кто-нибудь может помочь мне.Спасибо заранее.

1 Ответ

0 голосов
/ 12 декабря 2018

TypeScript - это просто печатный слой javascript.Таким образом, вы не можете волшебным образом преобразовать одно значение в другое, просто определив типизацию.Вы действительно должны жестко закодировать типы.В вашем случае:

getMessages(): Observable<Message[]> {
  return this.restService.get('/message/list/' + this.owner).pipe(
    map((messages) => messages.map((message) => ({
      ...new Message(), ...message, ...{
        ID: parseInt(message.ID),
        senderID: parseInt(message.senderID),
        receiverID: parseInt(message.receiverID),
        marked: message.marked === '1'
      }
    }))
  )
}

Это гарантирует, что возвращаемый объект действительно является массивом класса Message.Вы также можете подумать об использовании специальных декораторов, которые гарантируют, что при создании класса вы получите правильный тип:

export class Message {
    @IsNumber()
    ID:                 number;
    mode:               string;
    @IsNumber()
    senderID:           number;
    @IsNumber()
    receiverID:         number;
    @IsBoolean()
    marked:             boolean;
    subject:            string;
}

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

Вы можете изменить вышеуказанный код на:

messages.map((message) => ({...new Message(), ...message))
...