(ts2339) 属性 'token' 在打字稿中的类型 'TopicMessage' 上不存在

(ts2339) Property 'token' does not exists on type 'TopicMessage' in typescript

下面是我自定义的带有 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

很抱歉让你看到我糟糕的英语。

这行代码声明类型 Message 可以是 any 类型 TokenMessageTopicMessage 或 [=15] 之一=].

type Message = TokenMessage | TopicMessage | ConditionMessage;

它使用的是 TypeScript union type,我建议阅读一下。

由于 Message 可以是这些类型中的任何一种,因此不保证 token 属性。只有 TokenMessage 保证有 token 属性。如果您想假设消息始终是 TokenMessage,那么您应该在使用它之前检查 属性 是否存在(或转换类型):

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