我一直收到错误
[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属性。
我错过了什么让流程接受这段代码?
答案 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,
})