brickyang / egg-mongo-native

MongoDB egg.js plugin using native driver.
MIT License
75 stars 11 forks source link

[bug] index.d.ts文件不支持多个数据库实例配置 #19

Closed wanghsinche closed 6 years ago

wanghsinche commented 6 years ago

当config.js 配置为

exports.mongo = {
  clients: {
    db1: {
      host: 'host',
      port: 'port',
      name: 'db1',
      user: 'user',
      password: 'password',
      options: {},
    },
    db2: {
      host: 'host',
      port: 'port',
      name: 'db2',
      user: 'user',
      password: 'password',
      options: {},
    },
  },
};

时,app.mongo理应为Map<string, Mongo>,而node_modules中的index.d.ts已经定义为Mongo。导致ts一直无法通过。即使在app的index.d.ts覆盖app.mongo的定义也不生效。

//我app的index.d.ts
declare module 'egg' {
  interface Application {
    mongo: Map<string, MongoDB>;
  }
  interface Context {
    [key: string]: any;
    multipart: () => Promise<any>;
    // mongo部分
    session: ISession|null;
  }
}
brickyang commented 6 years ago

这个问题目前我想到的最简单的办法就是在 index.d.ts 中的 declare class MongoDB 中增加一个 public get(name: string): MongoDB 方法。

这样声明和 MongoDB 类的实现是不一致的,但是暂时没找到更好的办法。

wanghsinche commented 6 years ago

感觉可以参考 egg-mongoose的做法, 开了个pull request #20

brickyang commented 6 years ago

Union Types 的问题是每次 app.mongo 都需要指定类型(as 或尖括号),比较麻烦。

你可以在本地修改后试一下。

wanghsinche commented 6 years ago

嗯,要不再推荐用户在ctx上extend一个方法,getMongo() 返回自己需要的类型,这样就不用每次都指定类型或者尖括号了。 我目前就是extend一个method 用 app.mongo as any as Map<string, Mongo>强制转为map。

brickyang commented 6 years ago

尽量不给用户增加额外工作量。

增加一个新类型 MongoDBSingleton 暂时解决这个问题。Egg 的设计机制注定了没法在 index.d.ts 里完美解决。