在Typescript中将静态导入转换为动态导入

在Typescript中将静态导入转换为动态导入,typescript,express,typescript2.0,express-session,Typescript,Express,Typescript2.0,Express Session,我有一个用TypeScript(2.7.1)编写的Express.js应用程序,我正在尝试动态导入Express会话模块。根据我的理解,从“快速会话”导入会话应等同于让会话=等待导入(“快速会话”)但是静态导入工作正常(如果安装了快速会话),而动态版本则会抱怨: error TS2349: Cannot invoke an expression whose type lacks a call signature. Type '{ default: typeof session; Store:

我有一个用TypeScript(2.7.1)编写的Express.js应用程序,我正在尝试动态导入
Express会话
模块。根据我的理解,
从“快速会话”导入会话
应等同于
让会话=等待导入(“快速会话”)
但是静态导入工作正常(如果安装了
快速会话
),而动态版本则会抱怨:

error TS2349: Cannot invoke an expression whose type lacks a call signature. 
Type '{ default: typeof session; Store: typeof Store; MemoryStore: typeof MemoryStore; }' 
has no compatible call signatures
以下是删除静态导入并使用
try catch
包围导入后我的文件的外观:

从“express”导入express
导出类MyServer{
公共应用程序:express.Application
构造函数(){
this.app=express()
this.init()
}
异步初始化(){
试一试{
const session=等待导入('express-session')
this.app.use(会话({secret:'my_secure_secret'}))
this.app.set('hasSession',true)
}捕获(e){
console.log('加载会话失败,不加载会话继续')
this.app.set('hasSession',false)
}
}
导入()函数实际上导入了整个CommonJS
导出
对象。检查
@types/express session
中的类型我们有:

[…]
声明函数会话(选项?:session.SessionOptions):express.RequestHandler;
声明命名空间会话{
接口会话选项{
秘密:string | string[];
名称?:字符串;
存储?:存储| MemoryStore;
cookie?:express.CookieOptions;
genid?(请求:express.Request):字符串;
滚动?:布尔值;
重存?:布尔值;
代理?:布尔;
saveUninitialized?:布尔值;
未设置?:字符串;
}
[...]
导出=会话;
此时,
export=session
实际上相当于
exports.default=session
(编译器将
session
理解为函数的引用,而不是名称空间,这仍然有点混淆),这导致了解决方案:

async init(){
试一试{
const session=(等待导入('express-session')。默认值
this.app.use(会话({secret:'my_secure_secret'}))
this.app.set('hasSession',true)
}捕获(e){
console.log('加载会话失败,不加载会话继续')
this.app.set('hasSession',false)
}