Машинопись - строка для ввода - PullRequest
0 голосов
/ 08 мая 2020

У меня есть класс Message, представляющий некоторые данные. Каждое сообщение имеет один и тот же заголовок. Однако в зависимости от типа сообщения они имеют разные полезные данные. Например:

class Message {
  serial: string
  length: number
}

class LKMessage extends Message {}

class UDMessage extends Message {
  location: Location
}

Проблема в том, что я не знаю тип сообщения. Пользователь просто говорит «отправить сообщение» и отправляет тип вместе с данными. Потенциально я мог бы создать разные пост-функции для каждого типа сообщения, но я бы написал много одного и того же кода.

Я пробовал что-то вроде этого:

interface MessagePayload {}

interface LKMessagePayload extends MessagePayload {}

interface UDMessagePayload extends MessagePayload {
  location: Location
}

class Message<T extends MessagePayload> {
  serial: string
  length: number
  payload: T
}

Проблема в создании экземпляра: пользователь отправляет тип как string, поэтому я не могу просто написать new Message<type>(data). Я подумал об использовании отражения, но не смог заставить его работать.

1 Ответ

0 голосов
/ 08 мая 2020

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

class Message {
    type: string = "base"
    serial: string
    length: number
}

class LKMessage extends Message {
    type: "LK" = "LK"
}

class UDMessage extends Message {
    type: "UD" = "UD"
    location: Location
}

Итак, когда вы пытаетесь читать сообщения, ваш код будет делать что-то вроде

let message: Message = readSomeMessageIn()

if (message.type === "UD") {
    const typedMessage: UDMessage = message as UDMessage;


} else if (message.type === "LK") {
    const typedMessage: LKMessage = message as LKMessage;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...