创建构造函数签名

时间:2019-11-22 13:13:33

标签: node.js typescript

我是打字稿新手,将现有的js代码迁移到ts代码。

显然connect-session-firebase没有自定义类型,因此我决定创建一个。

这就是我在代码中使用它的方式

import FirebaseSession from 'connect-session-firebase'

app.use(
            session({
                store: new FirebaseSession({
                    database: context.realtimeDB
                }),
                name: '__session', // Must use this name for firebase hosting
                secret: 'kkkkj9h9', // TODO: Move to ENV
                resave: true,
                saveUninitialized: true
            })
        )

这是我在哪里输入

declare module "connect-session-firebase" {
  import * as admin from 'firebase-admin'
  import { Request, Response, NextFunction } from "express";

  interface firebaseSession {
    database: admin.database.Database | admin.firestore.Firestore, 
    sessions?: string, 
    reapInterva?: string,
    errorIfSessionNotFound?: any
  }
}

我知道这是错误的,因为在这里store: new firebaseSession({我遇到了错误

this expression is not constructable.
  Type 'typeof import("connect-session-firebase")' has no construct signatures.

有人可以告诉我我在做什么错以及如何解决吗?

更新:我将firebaseSession更新为FirebaseSession,并尝试使用new(),但还是没有运气

declare module "connect-session-firebase" {
  import * as admin from 'firebase-admin'
  import { Request, Response, NextFunction } from "express";

   interface FirebaseSession {
    new(
    database: admin.database.Database | admin.firestore.Firestore, 
    sessions?: string, 
    reapInterva?: string,
    errorIfSessionNotFound?: any)
  }
}

但有相同的错误

更新:这是我的更新代码:

import FirebaseSession from 'connect-session-firebase'

app.use(
            session({
                store: new FirebaseSession({
                    database: context.realtimeDB
                }),
                name: '__session', // Must use this name for firebase hosting
                secret: 'kkkkj9h9', // TODO: Move to ENV
                resave: true,
                saveUninitialized: true
            })
        )

类型为connect-session-firebase

import * as admin from 'firebase-admin'

declare class FirebaseSession {
  constructor(options: FirebaseSession.Options)
}


declare namespace FirebaseSession {
  export interface Options {
    database: admin.database.Database | admin.firestore.Firestore, 
    sessions?: string, 
    reapInterva?: string,
    errorIfSessionNotFound?: any
  }
}


export = FirebaseSession

注意,尽管这不会在编译时引发错误,但会创建类似的JS代码

const connect_session_firebase_1 = __importDefault(require("connect-session-firebase"));
    app.use(express_session_1.default({
            store: new connect_session_firebase_1.default({
                database: context.realtimeDB
            }),
            name: '__session',
            secret: 'kkkkj9h9',
            resave: true,
            saveUninitialized: true
        }));

会引发错误connect_session_firebase_1.FirebaseSession is not a constructor

  

无法读取未定义的属性原型。

2 个答案:

答案 0 :(得分:1)

您可以这样尝试吗?

1)使用

创建一个type.d.ts

declare module "connect-session-firebase" {
    import * as admin from 'firebase-admin'
    export interface OptionsShape {
        database: admin.database.Database | admin.firestore.Firestore, 
        sessions?: string, 
        reapInterva?: string,
        errorIfSessionNotFound?: any
    }

    export interface FirebaseSession {
       new(n: OptionsShape): void
    }

    export class FirebaseSession {
       constructor(n: OptionsShape);
    }

    export default FirebaseSession;
}

2)导入您的模块并使用它(应该输入它,而不要抱怨任何类型

import FirebaseSession from 'connect-session-firebase'

var firebase = new FirebaseSession({
 //params
});

编辑:正如我在评论中所说,您可以像这样修复编译,但是现在由您来确定库的正确类型了。我不知道该库,所以我不知道new FirebaseSession({})的返回值是什么,或者FirebaseSession的属性和方法有什么...

您必须阅读该程序包并使其适应types.d.ts,以便它可以正常工作。您可能可以从软件包创建者那里获得帮助,并在完成后输入@types/connect-session-firebase。但是,如果只是为了使编译器正常工作,则可以继续打补丁(但不建议这样做)

declare module "connect-session-firebase" {
    import * as admin from 'firebase-admin'
    import { Store, MemoryStore } from 'express-session';
    export interface OptionsShape {
        database?: admin.database.Database | admin.firestore.Firestore, 
        sessions?: string, 
        reapInterva?: string,
        errorIfSessionNotFound?: any
    }

    export interface FirebaseSession {
       new(n: OptionsShape)
    }

    export class FirebaseSession extends MemoryStore {
       constructor(n: OptionsShape);
    }

    export default FirebaseSession;
}

答案 1 :(得分:0)

要将接口标记为可构造,请为其提供new(...)“方法”(更多here):

interface firebaseSession {
    new(/*...param declarations here if appropriate...*/): firebaseSession;
    // ...
}

如果可能的话,我也强烈建议将任何可构造的类型设置为初始上限(FirebaseSession而非firebaseSession)。