#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
}