Type Safety When Writing and Reading From Firestore
We want to ensure that certain metadata is included in every single document that is created, and updated, so a series of base interfaces have been created for use when creating a new firestore datatype. Adherance to this template will also help ensure data consistency when reading and writing to documents.
Creating A New Firestore Document Type
import { DocData, Metadata, CreateMetadata, UpdateMetadata } from './base';
interface MyDocBase<meta> extends DocData<meta> {
myField1: string;
myField2: number;
myField3: {
mySubfield: string,
};
}
export type MyDocData = MyDocBase<Metadata>;
export type MyDocCreateData = MyDocBase<CreateMetadata>;
export interface MyDocUpdateData extends Partial<MyDocBase<UpdateMetadata>> {
_metadata: UpdateMetadata;
}
Using Your New Type
db.collection('my-new-collection').doc('my-id').get().then(doc => {
const data = doc.data() as MyDocData;
})
const data: MyDocCreateData = {
}
db.collection('my-new-collection').doc('my-id').add(add)
const updateData: MyDocUpdateData = {
_metadata: {
updated_at: 'some-timestamp',
updated_by: 'some-user-id'
}
myField1: 'test',
myNonExistentField: 'test'
}
db.collection('my-new-collection').doc('my-id').update(updateData)