【问题标题】:Firestore Document Typescript doc.data() undefined?Firestore 文档 Typescript doc.data() 未定义?
【发布时间】:2020-01-04 13:00:45
【问题描述】:

目前正在清理一些代码并在 typescript 中重写了很多内容。我发现让我好奇的是以下代码:

    const userRef = firestore.collection('users').doc(userId);
    const userDoc = await userRef.get();

    if (userDoc.exists) {
        const userData = userDoc.data();

        const currentUserBalance = userData.balance ? userData.balance : 0;
    }

现在 Typescript 会抱怨 userData 可能是 undefined,但是当我在 if 块中检查上面存在的文档时,不能取消定义文档 .data()。只是好奇为什么会发生这种情况以及我是否有逻辑问题。

【问题讨论】:

  • 如果提供的答案对您有帮助,请将其标记为正确。

标签: javascript typescript firebase google-cloud-firestore


【解决方案1】:

不幸的是,尽管 Node.js 和 Web 的 Firestore 适配器主要是用 TypeScript 编写的,但它们并不是为这种语言设计的。

为了解决这个问题,我写了Typesaurus,TypeScript-first ORM(如果你愿意,也可以是 ODM)来解决这个问题:

import { get, collection } from './src'
type User = { name: string }
const users = collection<User>('users')

async function main() {
  const user = await get(users, 'qwe') // get will return document or undefined
  if (user) {
    console.log(user.data.name) // user is Doc<User>
  } else {
    // user is undefined
  }
}

main()

【讨论】:

    【解决方案2】:

    TypeScript 不知道existsdata() 之间的关系。它只知道data() 的签名表示返回值可以是 DocumentSnapshot 或 undefined。因此,您必须通过以下任一方式满足编译器:

    1. 首先检查“真实性”,如果是,则使用结果:
    const data = userDoc.data()
    if (data) {
        // In this block, data is now typed as just DocumentData,
        // undefined is no longer an option.
    }
    
    1. 使用 ! 运算符告诉 TypeScript 你确定结果将是“真实的”:
    const data = userDoc.data()!  // data is now typed as just DocumentData
    

    【讨论】:

    • @Doug Stevenson 实际上你只需要一个感叹号as documented here
    • @lukasgeiter 这也是我使用 Kotlin 得到的结果。
    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    相关资源
    最近更新 更多