打字稿:esnext 编译器选项会破坏来自外部库的 es6 导入

zzr*_*zrv 13 node-modules typescript

当将编译器选项的以太moduletarget属性设置为 esnext(id 喜欢使用import("example")语句)时,es6 导入语句将停止为npm installed 库工作(本地模块仍然工作:例如"./test.ts")。

所以这import * as asd from "testmodule";抛出cannot find module 'testmodule'. 然而,省略这两个属性使它工作。这是为什么,我应该使用什么标准来保留import("example")import * as asd from "testmodule";声明?


这是我的完整 tsconfig.json:

{
  "compilerOptions": {
    "outDir": "./dist/",
    "module": "esnext",
    "target": "esnext",
    "allowJs": true,
    "sourceMap": true
  }
}

Run Code Online (Sandbox Code Playgroud)

Alu*_*dad 19

"module"从任何一边"commonjs",你需要一个specifiy"moduleResolution"价值"node"。指定会"commonjs"隐式设置它。

我强烈建议您始终明确指定输出模块格式。

此外,尽管某些选项的名称,"target"并且"module"是独立的,垂直。它们的含义非常不同,不能混淆。

{
  "compilerOptions": {
    "outDir": "./dist/",
    "module": "esnext",
    "moduleResolution": "node",
    "target": "esnext", // this isn't relevant
    "allowJs": true,
    "sourceMap": true
  }
}
Run Code Online (Sandbox Code Playgroud)

"commonjs"是一种输出模块格式。ESNextimport(...)语句被转译为输出模块格式,就像其他模块语法如 ES2015importexport语句一样。

当您指定 时--module esnext,您是在告诉 TypeScript 根本不要转译任何模块语法。这就是--module它指定输出模块格式的重点,而不是源模块格式。