TypeScript导入用字符串插值报错‘String literal expected’,是否支持该写法?
关于TypeScript import语句中字符串插值的问题解答
没错,你碰到的这个问题是因为TypeScript(遵循ES模块规范)不允许在静态import语句中使用字符串插值,这就是你看到[ts] String literal expected错误的核心原因。
为啥静态import不能用插值?
ES模块的import是静态语法,编译器(不管是TypeScript还是JavaScript引擎)需要在编译/代码解析阶段就明确知道所有要导入的模块路径。这样才能做依赖分析、tree-shaking、静态类型检查这些关键的优化和校验工作。而字符串插值是要到代码运行时才会计算出最终值的,编译器根本没法提前确定你要导入的模块到底是什么,自然就会抛出错误。
那动态路径的需求怎么解决?
如果你的模块路径确实需要根据运行时的变量(比如process.cwd())来动态确定,那应该用ES2020引入的动态导入语法——import()函数。它会返回一个Promise,TypeScript对这个特性支持得很好。
把你的代码改成下面这样就行:
// 要是在async函数里,用await更直观 async function loadServer() { const app = await import(`${process.cwd()}/server`); // 在这里使用app导出的内容,比如 app.start() 之类的 } // 也可以用.then()处理异步流程 import(`${process.cwd()}/server`).then((app) => { // 处理模块逻辑 });
注意哦,动态导入是异步的,所以必须用异步的方式来处理导入后的模块。
额外提醒
如果你的模块路径不需要动态计算,那还是尽量用静态import,直接写字符串字面量就行:
import * as app from './server';
这样能享受到静态导入的所有好处——比如编译时的类型检查、tree-shaking优化,代码可读性也更强。
内容的提问来源于stack exchange,提问作者Shamoon
相关产品推荐
相关产品推荐

