Firebase.database.ServerValue.TIMESTAMP - 流错误属性`TIMESTAMP`(在对象文字中找不到属性)

时间:2018-04-13 11:28:31

标签: javascript firebase firebase-realtime-database flowtype

我一直收到错误

  

[flow] property TIMESTAMP(在对象文字中找不到属性)

在以下代码块上:

firebase
  .database()
  .ref(`${Config.ROOT}/transactions/${parentId}/`)
  .push({
    credits,
    date: moment().format('YYYY-MM-DDTHH:mm:ssZZ'),
    serverTimestamp: firebase.database.ServerValue.TIMESTAMP,   // <- here
    params: {
      value: euros,
    },
    type: 'topUp',
    details: transactionStatus,
  })

但是,如果我将鼠标悬停在ServerValue属性上,即使浏览器中的lint配置确认ServerValue中存在TIMESTAMP属性。

ServerValue property

我错过了什么让流程接受这段代码?

2 个答案:

答案 0 :(得分:0)

我可能错了,但似乎是将ServerValue解释为union type。消息说ServerValue有两种可能:

{
    TIMESTAMP: any | {}
}

{} //Empty

因此TIMESTAMP可能存在也可能不存在。你可能需要在它周围进行存在检查。也许是这样的:

const {TIMESTAMP} = firebase.database.ServerValue
if (TIMESTAMP != null) {
  firebase
    .database()
    .ref(`${Config.ROOT}/transactions/${parentId}/`)
    .push({
    credits,
    date: moment().format('YYYY-MM-DDTHH:mm:ssZZ'),
    serverTimestamp: TIMESTAMP, // No longer null
    params: {
      value: euros,
    },
    type: 'topUp',
    details: transactionStatus,
  })
} else {
  throw new Error("Missing TIMESTAMP");
}

答案 1 :(得分:0)

Firebase database TIMESTAMP被记录为非空对象,这似乎与流程理解不一致,因为any将包含null(any | {}any的关系是什么会包含一个对象?)。

我会查看flow获取firebase类型的位置,是使用node_modules中的firebase代码还是使用flow-typed或您自己的定义的项目?屏幕截图顶部显示的定义似乎是正确的,但不是底部的定义。我不认识你的短信用户界面能够就可能的原因提出建议。

此外,代码实际上有效吗?如果有必要,您可以使用$FlowFixMe注释来抑制错误。

我会避免使用类型细化,因为它没有记录您使用它来抑制不正确的流类型注释。

以下是您使用$FlowFixMe

的方式
firebase
  .database()
  .ref(`${Config.ROOT}/transactions/${parentId}/`)
  .push({
    credits,
    date: moment().format('YYYY-MM-DDTHH:mm:ssZZ'),
    // $FlowFixMe: TIMESTAMP incorrectly defined as potentially null
    serverTimestamp: firebase.database.ServerValue.TIMESTAMP,
    params: {
      value: euros,
    },
    type: 'topUp',
    details: transactionStatus,
  })