基于环境变量动态导入http/https模块报TS1141错误如何解决?
报错原因
ES Module 标准中的静态import语句是编译阶段静态执行的,必须使用固定的字符串字面量作为导入路径,不能使用运行时才能计算出结果的表达式,这就是触发TS1141报错的根本原因。
单个导入的可行方案
不需要分别导入两个模块,可通过运行时导入的方式实现需求,两种常见场景的实现如下:
方案1:动态import + 顶层await(ES Module 环境适用)
如果你的项目使用ES Module规范,可使用ES标准的动态import()语法配合顶层await实现:
// 先定义http/https模块的联合类型 type HttpModule = typeof import('http') | typeof import('https'); // 运行时动态导入对应模块 const http: HttpModule = await import( parseInt(process.env.SSL_ENABLED || '', 10) ? 'https' : 'http' ); const server = http.createServer(/* 你的服务配置 */);
注意:需要TS配置中开启
"module": "ES2022"/"module": "NodeNext",且Node.js版本 >=14.8 支持顶层await。
方案2:带类型标注的require(CommonJS环境适用)
如果你的项目使用CommonJS规范,可以直接沿用你原来的require写法,只需补充类型标注即可:
type HttpModule = typeof import('http') | typeof import('https'); const http: HttpModule = require(`http${parseInt(process.env.SSL_ENABLED || '', 10) ? 's' : ''}`); const server = http.createServer(/* 你的服务配置 */);
内容的提问来源于stack exchange,提问作者Cyclonecode
相关产品推荐
相关产品推荐

