【问题标题】:Using firebase functions from web sdk using typescript使用 typescript 从 web sdk 使用 firebase 函数
【发布时间】:2018-09-15 02:22:24
【问题描述】:

我正在尝试从 javascript SDK 直接调用 firebase 函数,而函数属性未在 firebase 上定义。

我已经更新到 firebase 模块的 4.12.1 版本

我正在使用打字稿并按如下方式导入模块

import * as firebase from 'firebase';

import * as functions from 'firebase/functions';

我正在尝试调用我的函数:

firebase.functions().httpsCallable('myFunc')(payload)

这会导致编译器错误:

“typeof firebase”类型上不存在属性“functions”。

根据文档应该如何调用它们:https://firebase.google.com/docs/functions/callable

如果我用常规导入替换导入,一切正常

const firebase = require('firebase');

const functions = require('firebase/functions'); 

类型定义是否存在已知问题,或者我在这里做错了什么?

【问题讨论】:

    标签: typescript firebase google-cloud-functions


    【解决方案1】:

    我遇到了同样的问题...

    在当前版本 4.12.1 的 firebase JS SDK 中,@firebase/* 类型的包似乎存在问题。它们根本不包含在 node_modules/firebase/app/index.d.ts 和 node_modules/firebase/index.d.ts 中。好像有branch "build-fixes" that target that issue

    更新:分支已合并,但未修复。我在这里添加了一个专门的拉取请求:https://github.com/firebase/firebase-js-sdk/pull/724,最近已经合并,期待下一个版本>4.13.1

    我通过将类型声明从 https://github.com/mpoehler/firebase-js-sdk/blob/master/packages/functions-types/index.d.ts 添加到 node_modules/firebase/app/index.d.ts 来修复它。这样做我可以在 VSC 中正确使用以下代码并输入建议。

    import * as firebase from 'firebase/app';
    import '@firebase/functions';
    
    firebase.initializeApp({
    ...
    });
    
    // call function
    let func = firebase.functions().httpsCallable('myFunc');
    func({text: 'huch'}).then(result => console.log('...and returned!'));
    

    这更像是一个肮脏的黑客而不是一个解决方案,我希望上面提到的 PR 将很快被合并。

    根据@jbb 的要求,这里是node_modules/firebase/app/index.d.ts 中需要的重要部分:

    declare namespace firebase {
       ....
       function functions(app?: firebase.app.App): firebase.functions.FirebaseFunctions;
       ...
    }
    
    declare namespace firebase.app {
       interface App {
       ...
       functions(): firebase.functions.FirebaseFunctions;
       ...
       }
    }
    
    declare namespace firebase.functions {
      export interface HttpsCallableResult {
        readonly data: any;
      }
      export interface HttpsCallable {
        (data?: any): Promise<HttpsCallableResult>;
      }
      export class FirebaseFunctions {
        private constructor();
        httpsCallable(name: string): HttpsCallable;
      }
      export type FunctionsErrorCode =
        | 'ok'
        | 'cancelled'
        | 'unknown'
        | 'invalid-argument'
        | 'deadline-exceeded'
        | 'not-found'
        | 'already-exists'
        | 'permission-denied'
        | 'resource-exhausted'
        | 'failed-precondition'
        | 'aborted'
        | 'out-of-range'
        | 'unimplemented'
        | 'internal'
        | 'unavailable'
        | 'data-loss'
        | 'unauthenticated';
      export interface HttpsError extends Error {
        readonly code: FunctionsErrorCode;
        readonly details?: any;
      }
    }
    

    【讨论】:

    • 有这方面的消息吗?你能分享你的 index.d.ts 吗?
    • @jbb 我没有添加完整的文件,因为它太多了。但是我在答案中添加了相关部分。你能试着确认我没有忘记任何东西吗?谢谢
    【解决方案2】:

    我相信你想要:

    import * as firebase from 'firebase/app'
    import 'firebase/functions'
    
    firebase.initializeApp({/* ... */});
    
    const myFn = firebase.functions().httpsCallable('myFn');
    

    【讨论】:

    • 恐怕同样的错误,打字稿拒绝编译找不到函数方法。
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2020-10-05
    • 2018-02-24
    • 2021-03-27
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多