我使用的是Firebase JavaScript Version 9 SDK。
和我试图使用withConverter()转换数据来从Firestore与TypeScript接口。
这里有一篇文章解释了如何使用通用转换器来实现它。它允许您创建一个通用转换器并重用它,而不是为每个接口创建新的转换器逻辑。这里是一个GIST,其中包含文章中的所有代码和注释,可以很好地解释它。
下面是我实现通用转换器的尝试:
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
);
但是我在converter<User>()
上得到这个TypeScript错误,说:
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)
为什么我得到这个错误?
我明白了
当查看此帮助文档时,我发现Version 9 SDK的正确转换器类型是PartialWithFieldValue
和QueryDocumentSnapshot
。
下面是完整的正确代码:
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>()
);
现在userDocRef
有DocumentReference<User>
的类型。