Как импортировать тип firestores в файл utils? - PullRequest
0 голосов
/ 27 марта 2020

В настоящее время logi c содержит функцию, которая обрабатывает определенную c часть записи данных, хранящихся в firestore:

private listenUserData (): void {
    this.unListenUserData = FirebaseDb
      .collection(`users`).doc(this.user.id)
      .collection(`userData`)
      .onSnapshot({ includeMetadataChanges: true }, (querySnapshot) => {
        const changes = getUserDataSnapshotChanges(querySnapshot)
        const { data, changeType } = changes

        data.config && this.handleConfigChanges(data.config, changeType)
        data.personalData && this.handlePersonalDataChanges(data.personalData)
      })
  }

... она использует утилиту, которая обрабатывает querySnapshot и возвращает объект :

export function getUserDataSnapshotChanges (querySnapshot: any): UserDataSnapshotChangesType {
  const changes: UserDataSnapshotChangesType = {
    data: {},
    changeType: ``,
    isEmpty: querySnapshot.empty
  }

  querySnapshot.docChanges().forEach((docChange: any) => {
    const { doc } = docChange

    changes.data[doc.id] = doc.data()
    changes.changeType = docChange.type
  })

  return changes
}

, как вы могли видеть на данный момент, QuerySnapshot и docChange используют любой тип, поскольку, пытаясь что-то вроде import { DocumentChange } from 'firebase'

, я немного изучил index.d.ts из firebase и следующий тип является частью пространства имен firebase.firestore: enter image description here

Буду очень признателен, если кто-нибудь поделится некоторыми идеями по этому делу:
1. это означает, что нет фактического способа импортировать этот тип, если он является частью неэкспортируемого пространства имен?
2. И если теперь, что может быть возможным способом получить доступ к firestore ради кода типа safe

1 Ответ

0 голосов
/ 30 марта 2020

Вы должны создать свой экземпляр FirebaseDb методом firebase.firestore(). Насколько я знаю, типы должны быть доступны внутри пространства имен firebase.firestore.

Тип для querysnapshot будет firebase.firestore.QuerySnapshot https://firebase.google.com/docs/reference/js/firebase.firestore.QuerySnapshot

тип для docChange будет firebase.firestore.DocumentChange https://firebase.google.com/docs/reference/js/firebase.firestore.DocumentChange

export function getUserDataSnapshotChanges (querySnapshot: firebase.firestore.QuerySnapshot): UserDataSnapshotChangesType {
  const changes: UserDataSnapshotChangesType = {
    data: {},
    changeType: ``,
    isEmpty: querySnapshot.empty
  }

  querySnapshot.docChanges().forEach((docChange: firebase.firestore.DocumentChange) => {
    const { doc } = docChange

    changes.data[doc.id] = doc.data()
    changes.changeType = docChange.type
  })

  return changes
}

Я обращаюсь к типам Firebase таким образом, и он отлично работает для меня.

EDIT

Я не знаю, какая версия у вашего модуля узла Firebase, но это работает для версии 7.13.

Если вы просто хотите импортировать классы, вы можете использовать этот импорт.

import {QuerySnapshot, DocumentChange} from '@firebase/firestore-types';

И используйте его вот так.

export function getUserDataSnapshotChanges (querySnapshot: QuerySnapshot): UserDataSnapshotChangesType {
  const changes: UserDataSnapshotChangesType = {
    data: {},
    changeType: ``,
    isEmpty: querySnapshot.empty
  }

  querySnapshot.docChanges().forEach((docChange: DocumentChange) => {
    const { doc } = docChange

    changes.data[doc.id] = doc.data()
    changes.changeType = docChange.type
  })

  return changes
}

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...