Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在Firebase项目内共享Typescript接口_Angular_Typescript_Firebase_Google Cloud Firestore - Fatal编程技术网

Angular 在Firebase项目内共享Typescript接口

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应用程序上工作,但在后端不工

我正在一个Firebase项目中工作,其中前端是用Angular编写的。我正在使用@angular/fire库

我定义了几个使用firebase和firestore类型的接口

e、 g

现在我想在Angular中的前端和firebase SDK上编写的后端云函数之间共享这个接口

问题是,到目前为止,我无法以同时适用于这两个项目的方式导入“GeoPoint”之类的类型

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>