(ts2339) Свойство ‘token’ не существует для типа ‘TopicMessage’ в typescript

#typescript #firebase #firebase-cloud-messaging #firebase-admin

#typescript #firebase #firebase-cloud-messaging #firebase-admin

Вопрос:

Ниже приведен мой пользовательский интерфейс с интерфейсом сообщений администратора firebase

 interface PushPayload {
  userId: number
  conId?: number
  pushLogCodeKey: string
  messagePayload: admin.messaging.Message
}
  

И я попытался получить токен

 const blah = something.messagePayload.token
  

Но я получил код ошибки ts (2339). В модуле администратора firebase в инструкции assign есть несколько отдельных строк. Есть ли какая-либо связь между моей проблемой и ними?

Ниже приведен тип интерфейса.

 interface TokenMessage extends BaseMessage {
  token: string;
}

interface TopicMessage extends BaseMessage {
  topic: string;
}

interface ConditionMessage extends BaseMessage {
  condition: string;
}

export namespace admin.messaging {
  type Message = TokenMessage | TopicMessage | ConditionMessage;
  ...
}
  

Моя версия typescript — 3.9.7, а версия firebase-admin — 9.2.0

Извините, что заставляю вас читать мой ужасный английский.

Комментарии:

1. Тип сообщения может быть любым: TokenMessage, TopicMessage или ConditionMessage . token существует только в TokenMessage. Таким образом, это не гарантирует, что тип сообщения будет TokenMessage . Вот почему вы видите эту ошибку. Попробуйте удалить TopicMessage и сообщение условия. Надеюсь, вы не увидите ошибку.

2. @ApalShah Есть ли какой-нибудь способ избежать этой ошибки, например, добавить что-то после «messagePayload: admin.messaging. Сообщение»? Боюсь, я не знаю, что произойдет из-за смены библиотеки..

3. Написание настраиваемой защиты типов поможет TypeScript сузить тип и устранить ошибку, а также указать путь, по которому нужно следовать, если требуемое свойство не существует. Смотрите Эту часть документации typescriptlang.org/docs/handbook /…

Ответ №1:

В этой строке кода объявляется, что тип Message может быть любым из типов TokenMessage , TopicMessage , или ConditionMessage .

 type Message = TokenMessage | TopicMessage | ConditionMessage;
  

Он использует тип объединения TypeScript, о котором я предлагаю прочитать.

Поскольку Message может быть любым из этих типов, наличие token свойства не гарантируется. TokenMessage Гарантируется token , что свойство имеет только. Если вы хотите предположить, что сообщение всегда является a TokenMessage , то вам следует проверить, существует ли свойство (или приведение типа) перед его использованием:

 const payload = something.messagePayload
if (payload.token) {
    const token = payload.token
}