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>.
