在TypeScript项目(与Babel 7一起编译)中,我有一个用JavaScript编写的供应商目录(扩展名为.js
)。
我的常规TypeScript文件(扩展名为.ts
)从此JavaScript目录导入类:
import Pool from "mysqljs/lib/Pool";
我的baseUrl
是src
,并且由于src/mysqljs/lib/Pool.js
是JavaScript文件,因此在执行new Pool(...)
时遇到以下错误:
Cannot use 'new' with an expression whose type lacks a call or construct signature.ts(2351)
即使我在allowJs
中将true
设置为tsconfig.json
,也会发生这种情况。看来TypeScript需要我声明mysqljs
的类型,这很好。
但是,我不明白如何在应用程序中声明这些子模块的类型。
我尝试创建一个Pool.d.ts
作为mysqljs/lib/Pool.js
的同级兄弟,
declare module "mysqljs/lib/Pool" {
import Pool from "mysqljs";
export default Pool;
}
但这没有用,导入并尝试使用它时出现以下错误:
import Pool from "mysqljs/lib/Pool";
function f(p: Pool) {}
//Cannot use namespace 'Pool' as a type.ts(2709)
const pool = new Pool(...);
// Cannot use 'new' with an expression whose type lacks a call or construct signature.ts(2351)
(请注意,我在index.d.ts
中有一个these contents有一个mysqljs/
)
使用Flow,我的方法是创建一个mysql.js.flow
文件,该文件声明mysqljs
及其子模块的所有类型。