在TypeScript中动态导入模块

Sta*_*kop 8 import module typescript

什么是动态加载模块的TypeScript方式(模块的路径在运行时已知)?我试过这个:

var x = "someplace"
import a = module(x)
Run Code Online (Sandbox Code Playgroud)

但似乎TypeScript编译器希望在编译时将路径视为导入/模块中的字符串:

$ tsc test.ts 
/tmp/test.ts(2,19): error TS1003: Identifier expected.
/tmp/test.ts(2,20): error TS1005: ';' expected.
Run Code Online (Sandbox Code Playgroud)

我知道我可以直接使用RequireJS(如果我使用amd模块格式),但这对我来说感觉不对 - 它是一个特定库的解决方案.

ale*_*ung 14

从TypeScript 2.4开始支持ES提议动态导入.文件在这里.

import函数是同步的并返回一个Promise.

var x = 'someplace';
import(x).then((a) => {
  // `a` is imported and can be used here
});
Run Code Online (Sandbox Code Playgroud)

或使用async/await:

async function run(x) {
  const a = await import(x);
  // `a` is imported and can be used here
}
Run Code Online (Sandbox Code Playgroud)

  • 绝对不会想到这个! (2认同)

bas*_*rat 8

您需要指定一个硬编码字符串.变量将无法工作,因为这意味着代码必须存在于import(x)打字机将为您生成的调用之外.您的所有文件代码必须实际生活在"内部"这个定义调用javascript生成.:)

但是,如果您不使用打字稿AMD功能并且只使用requirejs.d.ts,您可以自己完成


Rya*_*erg 5

如果您想动态地从默认导出中提取类型,可以这样做:

    const dynamicImport = await import('path-to-import')
    const typedDefaultImport = dynamicImport.default
Run Code Online (Sandbox Code Playgroud)