Hvordan lage en TypeScript generisk konverterer for Firestore med withConverter()?


Jeg bruker Firebase JavaScript-versjon 9 SDK.

Og jeg prøver å bruke withConverter() for å konvertere data som kommer til og fra Firestore med TypeScript-grensesnitt.

Det finnes en artikkel her som forklarer hvordan man gjør det ved å bruke en generisk konverter. Den lar deg lage én generisk konverter og gjenbruke den i stedet for å lage ny konverteringslogikk for hvert grensesnitt. Her er en GIST med all koden fra artikkelen og kommentarer som forklarer det godt.

Og her er mitt forsøk på å implementere den generiske konverteren:

interface User {
  id?: string;
  name: string;
}

const converter = <T>() => ({
  toFirestore: (data: Partial<T>) => data,
  fromFirestore: (snap: FirebaseFirestore.QueryDocumentSnapshot) =>
    snap.data() as T,
});

const userDocRef = doc(db, 'users', 'my-user-id').withConverter(
  converter<User>() // <-- Error here
);

Men jeg får denne TypeScript-feilen på converter<User>() som sier dette:

No overload matches this call.
  Overload 1 of 2, '(converter: null): DocumentReference<DocumentData>', gave the following error.
  Overload 2 of 2, '(converter: FirestoreDataConverter<User>): DocumentReference<User>', gave the following error. ts(2769)

Hvorfor får jeg denne feilen?

Svar #1

Fikk det til.

Når jeg så på dette hjelpedokumentet, fant jeg ut at de riktige konvertertypene for Version 9 SDK var PartialWithFieldValue og QueryDocumentSnapshot.

Her er den fullstendige korrekte koden:

interface User {
  id?: string;
  name: string;
}

const converter = <T>() => ({
  toFirestore: (data: PartialWithFieldValue<T>) => data,
  fromFirestore: (snap: QueryDocumentSnapshot) => snap.data() as T,
});

const userDocRef = doc(db, 'users', 'my-user-id').withConverter(
  converter<User>()
);

Nå har userDocRef en type DocumentReference<User>.

Relaterte artikler