У меня есть файл TypeScript, который содержит класс модели. Этот класс моделей отображает документы в моем Firestore. Класс может иметь следующие поля:
class MyObject {
myName: string;
myAge: number;
myFriends: Array<string>
// contructor
}
API Firebase предлагает FirebaseDataConverter
для преобразования данных документа в объект этого класса и наоборот. Я добавил это в свой класс модели:
class MyObject {
//...
static firestoreConverter: firebase.firestore.FirestoreDataConverter<MyObject> = {
toFirestore: function (myObject: MyObject): firebase.firestore.DocumentData {
return JSON.parse(JSON.stringify(myObject));
}
fromFirestore: function (snapshot: firebase.firestore.QueryDocumentSnapshot<MyObject>, options: firebase.firestore.SnapshotOptions): MyObject {
let docData = snapshot.data(options);
let data = JSON.parse(JSON.stringify(docData));
// call constructor with fields from data
return new MyObject(...);
}
}
}
Теперь я могу добавить этот конвертер в ссылку на коллекцию:
import * as firebase from 'firebase';
// initialize firebase etc.
const firestore = firebase.firestore();
const myCollectionRef = firestore.collection("MyCollection").withConverter(MyObject.firestoreConverter);
С этим механизмом я получаю непосредственно MyObjects и не должен анализировать их каждый раз, когда я читаю, пишу и т. д. c. их.
До сих пор это работало нормально для веб-библиотеки JavaScript. Я хочу использовать этот механизм сейчас с Admin SDK. Сначала все выглядит хорошо:
import * as admin from "firebase-admin";
// initialize firebase etc.
const firestore = admin.firestore();
const myCollectionRef = firestore.collection("MyCollection").withConverter(MyObject.firestoreConverter);
Но если я получаю документ и пытаюсь получить доступ к содержимому с помощью doc.data()
, он говорит: Type 'unknown' is not assignable to type 'MyObject'.
myCollectionRef.doc("myId").get().then(snapshot => {
let myObject: MyObject = snapshot.data();
});
Кто-нибудь знает, что мне делать? нужно изменить, чтобы получить MyObject
, а не unknown
?
РЕДАКТИРОВАТЬ
Кажется, что он не поддерживается, как описано здесь . Переключите «Сеть», чтобы увидеть пример JavaScript. Переключите 'Node.js', чтобы увидеть, что он просто использует простые JavaScript объекты. Я до сих пор удивляюсь, почему это невозможно. Разве объект Firestore не имеет такой же тип?!