Typescript:esnext 编译器选项会破坏从外部库导入的 es6

Posted

技术标签:

【中文标题】Typescript:esnext 编译器选项会破坏从外部库导入的 es6【英文标题】:Typescript: esnext compiler option destroys es6 import from external lib 【发布时间】:2019-12-14 10:05:58 【问题描述】:

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

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


这是我的完整 tsconfig.json:


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


【问题讨论】:

【参考方案1】:

TLDR:当"module" 是除"commonjs" 之外的任何内容时,您需要明确指定"moduleResolution" 的值"node" 才能正常工作。指定 "commonjs" 会隐式执行此操作。

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

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


  "compilerOptions": 
    "outDir": "./dist/",
    "module": "esnext",
    "moduleResolution": "node",
    "target": "esnext", // this isn't relevant
    "allowJs": true,
    "sourceMap": true
  

"commonjs" 是一种输出 模块格式。 ESNext import(...) 语句被转译成输出模块格式,就像其他模块语法如 ES2015 importexport 语句一样。

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

【讨论】:

我知道已经很晚了,但你还记得你从哪里得到的吗?感谢您的解释,我已经用我的代码解决了同样的问题 我从哪里得到什么?

以上是关于Typescript:esnext 编译器选项会破坏从外部库导入的 es6的主要内容,如果未能解决你的问题,请参考以下文章

仅当“模块”选项设置为“esnext”时才允许使用***“等待”表达式

IntelliJ JSHint esversion 选项

将 typescript 错误连接到其关联的编译器选项 (tsconfig.json)

将 Typescript 的 baseUrl 编译器选项与节点一起使用

VS2017 MS 版本不支持 typescript 编译器选项路径的问题

TypeScript教程# 5:TS编译选项