首页 > 解决方案 > TypeScript 引用非静态方法

问题描述

我需要从根目录加载一个模块,所以我习惯require.main.require()这样做。由于 import 无法访问根目录,所以我需要使用 require。但是,这是引用错误的connect()方法:

export class MongoClient extends EventEmitter {
  connect(callback: MongoCallback<MongoClient>): void;
}

我需要的是它引用静态方法:

export class MongoClient extends EventEmitter {
  static connect(uri: string, options?: MongoClientOptions): Promise<MongoClient>;
}

代码在使用 node 编译和执行时运行良好,只是它在编辑器中显示错误。这就是我正在做的事情:

declare type MongoClient = import('mongodb').MongoClient

const mongo = require.main && require.main.require('mongodb')
const MongoClient: MongoClient = mongo.MongoClient

async function connect() {
  let url = 'mongodb://....' 
  await MongoClient.connect(url, { useNewUrlParser: true })
}

预期 0-1 个参数,但得到 2 个。

标签: javascripttypescript

解决方案


问题是打字稿期望connect在变量上调用成员函数,但类型声明指定connect为静态。

由于您必须通过 require.main 导入,这会导致实例而不是静态类,因此最简单的解决方法是将 connect 重新声明为实例成员。

import { MongoClient, MongoClientOptions} from "mongodb";

declare class MyMongoClient extends MongoClient {
  connect(uri: string, options?: MongoClientOptions): Promise<MongoClient>;
  connect(): Promise<MongoClient>;
}

const mongo = require.main && require.main.require('mongodb')
const mongoClient = mongo.MongoClient  as MyMongoClient

async function connect() {
  let url = 'mongodb://....'
  await mongoClient.connect(url, { useNewUrlParser: true })
}

由于 declare 关键字,实际模块在编译后不会被拉入。


推荐阅读