【问题标题】:"This syntax requires an imported helper but module 'tslib' cannot be found" with ES2015 modules“此语法需要导入的帮助程序,但找不到模块 'tslib'”与 ES2015 模块
【发布时间】:2019-03-19 00:00:59
【问题描述】:

我有一个演示项目,我即将编译为 ES5,启用 ES2015 模块,tslib 用于外部 TS 助手:

package.json

{
  "name": "foo",
  "scripts": {
    "build": "tsc"
  },
  "dependencies": {
    "tslib": "^1.9.3"
  },
  "devDependencies": {
    "typescript": "^3.1.3"
  }
}

tsconfig.json

{
  "compilerOptions": {
    "target": "es5",
    "module": "es2015",
    "outDir": "./lib",
    "rootDir": "./src",
    "importHelpers": true,
    "strict": true,
    "experimentalDecorators": true
  }
}

src/index.ts

function a(target: any) {
    return target;
}

@a
export class Foo {}

这会导致错误:

src/index.ts:5:1 - 错误 TS2354:此语法需要导入的帮助程序,但找不到模块“tslib”。

虽然lib/index.js 已正确编译:

import * as tslib_1 from "tslib";
function a(target) {
    return target;
}
var Foo = /** @class */ (function () {
    function Foo() {
    }
    Foo = tslib_1.__decorate([
        a
    ], Foo);
    return Foo;
}());
export { Foo };

如何解决这个问题?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    菜鸟错误(我刚刚犯了)。试试:

    npm install tslib
    

    npm i
    

    在周五结束之前,我个人做了一个git clean -fxd,但没有npm i,所以所有的 npm 包都丢失了。呵呵!

    【讨论】:

    • 我永远不会知道为什么它不包含在 许多 角度依赖项之一中:(
    • "tslib 不是 angular 本身的依赖项。而是当您启用 TypeScript importHelpers 时 TypeScript 编译器的依赖项。任何使用 importHelpers 编译的库都应该始终直接依赖于 tslib 而不是依赖在其他库上安装它。” github.com/angular/angular-cli/issues/…
    • git clean -fxd 命令也删除了所有有用的文件。 (.env 和共享文件夹)
    【解决方案2】:

    对我来说,问题是编辑器使用的 TypeScript 版本与项目不同。

    解决这个问题:

    1. 打开命令面板(Mac 上是 Cmd+Shift+P。焦点文件必须是 .ts 或 .tsx,否则不会显示更改版本的选项)
    2. 选择“TypeScript:选择 TypeScript 版本...”
    3. 它显示了 VSCode 的 TS 版本和 Workspace 的(项目)之一,选择那个

    或者点击底部栏的版本号,如果它显示在那里:

    【讨论】:

    • 更新到 Ng12 后,已经安装了 tslib 并收到 This syntax requires an imported helper but module 'tslib' cannot be found. 错误,这个简单的解决方案就是我所需要的。 PS,答案有点模棱两可,所以为了澄清你必须选择:Workspace's (project)
    • 这应该是公认的答案
    • 确实,这必须是公认的答案。
    【解决方案3】:

    以下行添加到tsconfig.json

    "compilerOptions": {
        //...rest parameters
    
        "baseUrl": "./",
        "paths": {
          "tslib" : ["path/to/node_modules/tslib/tslib.d.ts"]
        },
    

    【讨论】:

      【解决方案4】:

      刚刚将 tslib 更新到最新版本,问题已经解决。我已经安装了1.9.3,并更新为1.10.0

      【讨论】:

        【解决方案5】:

        正如the reference 所说,模块分辨率仅针对"modules": "commonjs" 设置为节点模式,而针对"modules": "es2015" 设置为经典模式:

        有两种可能的模块解析策略:Node 和 Classic。您可以使用 --moduleResolution 标志来指定模块解析策略。如果未指定,默认为 Classic for --module AMD |系统 | ES2015 或 Node 其他

        由于经典模式不知道node_modules,编译器无法解析tslib 模块。

        moduleResolution 应该为 ES2015 模块显式设置:

        ...
        "module": "es2015",
        "moduleResolution": "node",
        ...
        

        【讨论】:

          【解决方案6】:

          我的错误似乎是零星的,但可能是由编辑“node_modules”文件夹中的文件引起的。

          我删除了

          • “node_modules”文件夹
          • “package-lock.json”文件

          跑...“npm install”

          它现在可以工作了。

          注意:我尝试在删除文件之前运行“npm install”,但这并没有解决问题。

          【讨论】:

          • 对了,可能需要删除node_modules,npm install还不够强行重装。可以使用npm install packagename 重新安装特定损坏的包,但这不适用于所有包,也不能解决所有依赖问题。强烈建议不要在没有充分理由的情况下删除 package-lock.json,这可能会带来新问题,除非您知道问题在那里传播。
          【解决方案7】:

          更新package.json中tslib的依赖和devDependencies

          {
             dependencies:{
               "tslib": "1.10.0",
             },
             devDependencies:{
               "tslib": "1.10.0",
             }
          }
          

          【讨论】:

          • Imo 仅添加到依赖项就足够了,它们也在开发模式下安装。
          【解决方案8】:

          在我的情况下,错误 Cannot find module 'tslib' 是由我的 Angular 存储库中的特殊构建器 @nrwl/node:build 引起的(我使用带有 NodeJS 服务器的 nrwl/nx monorepo 模式作为应用程序之一)。

          它没有在编译输出中包含tslib。在angular.json 的生产构建配置中设置"externalDependencies": "none" 解决了这个问题。归功于@vincastl:https://github.com/nrwl/nx/issues/2625

          在这里发布它,因为这是我发现的第一篇试图解决这个问题的帖子,也许我并不孤单。

          【讨论】:

          • 谢谢。这对我有帮助。我搜索了错误并没有任何帮助,直到我在搜索中添加“nx”并找到了这个。
          【解决方案9】:

          npm 安装

          如果您在第一次打开新项目或存储库时看到此错误,则可能只是您尚未安装应用所需的模块。

          在应用的目录下,运行:

          npm install

          【讨论】:

            【解决方案10】:
            npm i -g tslib
            

            这解决了我的问题。没有 -g 它对我不起作用。

            【讨论】:

              【解决方案11】:

              在您的项目中,只需运行

              npm i tslib 
              

              它包含所有的打字稿辅助函数

              【讨论】:

                【解决方案12】:

                <PropertyGroup> 内的 .csproj 文件中添加以下行:

                <TypeScriptCompileBlocked>True</TypeScriptCompileBlocked>
                

                【讨论】:

                • 你是如何假设他使用 .NET 的?
                • @DanielStoyanoff 大多数建议的解决方案都不适用,因为该问题包含this answer 中描述的一个非常具体的问题。我想大多数海报只是描述了他们为什么会出现这个错误。这对于有类似 TS 问题但原因不同的用户可能很有用,在这方面,带有 C# 设置的帖子看起来并不像其他任何帖子一样有用。
                【解决方案13】:

                在你的项目中执行:npm install --force

                【讨论】:

                • 您能否为您的解决方案提供更多解释?这个终端命令有什么作用,它对 OP 有什么帮助?
                【解决方案14】:

                升级 tslib 版本 2.00.0

                在 package.json 中应该是 "tslib": "^2.0.0"

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2019-01-14
                  • 2012-06-01
                  • 2016-05-22
                  • 2017-10-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-10-25
                  相关资源
                  最近更新 更多