Angular 在Firebase项目内共享Typescript接口
我正在一个Firebase项目中工作,其中前端是用Angular编写的。我正在使用@angular/fire库 我定义了几个使用firebase和firestore类型的接口 e、 g 现在我想在Angular中的前端和firebase SDK上编写的后端云函数之间共享这个接口 问题是,到目前为止,我无法以同时适用于这两个项目的方式导入“GeoPoint”之类的类型Angular 在Firebase项目内共享Typescript接口,angular,typescript,firebase,google-cloud-firestore,Angular,Typescript,Firebase,Google Cloud Firestore,我正在一个Firebase项目中工作,其中前端是用Angular编写的。我正在使用@angular/fire库 我定义了几个使用firebase和firestore类型的接口 e、 g 现在我想在Angular中的前端和firebase SDK上编写的后端云函数之间共享这个接口 问题是,到目前为止,我无法以同时适用于这两个项目的方式导入“GeoPoint”之类的类型 import { firestore } from 'firebase'; 在Angular应用程序上工作,但在后端不工
import { firestore } from 'firebase';
在Angular应用程序上工作,但在后端不工作,编译失败
Angular app package.json
...
"dependencies": {
"@angular/animations": "~10.1.6",
"@angular/cdk": "^10.2.5",
"@angular/common": "~10.1.6",
"@angular/compiler": "~10.1.6",
"@angular/core": "~10.1.6",
"@angular/fire": "^6.0.3",
"@angular/forms": "~10.1.6",
"@angular/localize": "^10.1.6",
"@angular/material": "^10.2.5",
"@angular/platform-browser": "~10.1.6",
"@angular/platform-browser-dynamic": "~10.1.6",
"@angular/router": "~10.1.6",
"firebase": "^7.13.1",
"ngx-wig": "^10.0.1",
"rxjs": "~6.5.4",
"tslib": "^2.0.0",
"zone.js": "~0.10.2"
},
...
Backend pakage.json
...
"dependencies": {
"firebase-admin": "^8.10.0",
"firebase-functions": "^3.6.1"
},
...
如果不需要,我不想在BE中导入完整的firebase包,因为它只需要一个类型定义。最好的方法是什么?web客户端和后端SDK的API和接口都不同。它们不共享Firestore数据类型的通用定义,因此在接口中没有任何东西可以同时编译和工作,除非在所有代码中导入这两个定义,并使用联合类型来接受这两个定义 具体来说,web客户端的
firebase
模块导出,而firebase admin
重新导出Google Cloud SDK。它们根本不是同一个对象,你不能强迫它们实际上是同一个对象。其他类型(如FieldValue和Timestamp)也是如此——它们只是不同库之间的不同类型
在这里,您最好创建自己的抽象层,这两个SDK都可以实现。因此,您将引入自己的GeoPoint接口,并在幕后提供实现该接口的对象,而不管是哪个SDK生成了文档。仅仅在前端和后端之间共享一些接口确实需要做很多工作,但如果您不愿意在两侧导入SDK,就必须这样做。我刚刚有了一个想法,不确定这是否有帮助。如果我们用泛型来确定地质点呢
export interface SchoolAddress<T> {
street: string;
city: string;
state: string;
region: string;
zip: string;
note: string;
position?: T;
}
导出接口地址{
街道:字符串;
城市:字符串;
状态:字符串;
区域:字符串;
拉链:细绳;
注:字符串;
位置?:T;
}
拥有firebase管理员的项目将使用此界面作为
import * as admin from "firebase-admin";
const schoolAddress:SchoolAddress<admin.firestore.GeoPoint>
import*作为“firebase管理员”的管理员;
const学校地址:学校地址
具有正常firestore的项目将用作
import { firestore } from 'firebase';
const schoolAddress:SchoolAddress<firestore.GeoPoint>
从'firebase'导入{firestore};
const学校地址:学校地址
import { firestore } from 'firebase';
const schoolAddress:SchoolAddress<firestore.GeoPoint>