这个语法需要导入一个辅助模块,但是在 ES2015 模块中却找不到 'tslib' 模块。

244

我有一个演示项目,我将使用ES2015模块编译为ES5,并使用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 - error 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 };

如何解决这个问题?

23个回答

252
对我来说,问题是编辑器使用的TypeScript版本与项目不同。
要解决这个问题:
1. 打开命令面板(在Mac上是Cmd+Shift+P。焦点文件必须是.ts或.tsx,否则不会显示更改版本的选项) 2. 选择"TypeScript: Select TypeScript Version..." 3. 它会显示VSCode的TS版本和工作区(项目)的版本,选择工作区的版本(注意:这假设您已经在工作区中安装了npm包) 或者,如果底部栏显示版本号,请点击版本号:


12
升级到Ng12后,已经安装了tslib,但出现“此语法需要导入的助手程序,但找不到'tslib'模块”的错误。这个简单的解决方案就是我所需要的。补充一下,问题描述有些含糊,为了澄清,你必须选择“工作区(项目)”。 - Alfa Bravo
4
这不应该被接受为答案,因为提问者没有提到他们正在使用VSCode。 - Heretic Monkey
1
那解决了我的问题。 - J4N
谢谢,这很有帮助。我从内置的4.7.3版本改为本地的node_modules同样的4.7.3版本,错误消失了... - Arthur_J
3
这对我有用,但我还必须使用“TypeScript:重新加载项目”命令。 - Bruce
显示剩余2条评论

240

尝试类似以下代码:

npm install tslib --save-dev

或者,为了纠正初学者的错误(我刚刚犯了这个错误):

npm i

我是说,上周五在签名之前,我运行了git clean -fxd,但没有运行npm i,所以所有的npm包都消失了。哎呀!


3
我永远不会知道为什么这个东西没有包含在众多的Angular依赖项中 :( - Ben Winding
16
"tslib并不是Angular本身的依赖项,而是TypeScript编译器的依赖项,当您启用TypeScript importHelpers时才需要。使用importHelpers编译的任何库都应始终直接依赖于tslib,而不是依赖其他库来安装它。" - Paul Lockwood
git clean -fxd 命令也删除了所有有用的文件。(.env 和 shared 文件夹) - Aravin
2
@Aravin 这就是为什么你不要运行你在互联网上看到的任何命令。 - SIMMORSAL

68
tsconfig.json 中添加以下行:
"compilerOptions": {
    //...rest parameters

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

这似乎解决了问题。 - Ali Celebi

25
在我的情况下,将importHelpers编译器选项移除或设置为false解决了这个问题。
{
  "compilerOptions": {
    ...
    "importHelpers": false, // Or remove this
    ...
  }
}

23

在我的情况下,tslib已经安装,但我只看到一个组件出现了错误,而其他一切都正常——构建和功能。我只是重新启动了我的vscode,错误就不见了。所以,如果你已经尝试过别人建议的操作但错误仍然存在,可以尝试重新启动vscode。


1
有时候重新启动IDE或开发服务器会非常有帮助,特别是当出现不能重现且不应该存在的模糊TS错误时。 - Estus Flask
2
是的,我也遇到了同样的问题,重启VSCode解决了它。 :) - crowmagnumb

21

刚刚将tslib更新到最新版本,问题已经解决。之前我安装的是1.9.3,现在升级到了1.10.0


9
根据参考文献,对于"modules": "commonjs",模块解析设置为 Node 模式,对于"modules": "es2015",则设置为 classic 模式:

有两种可能的模块解析策略:Node 和 Classic。您可以使用 --moduleResolution 标志来指定模块解析策略。如果未指定,则默认情况下为 --module AMD | System | ES2015 时的 Classic 或者在其他情况下为 Node。

由于 classic 模式不了解 node_modules,编译器无法解析 tslib 模块。

应该为 ES2015 模块显式设置moduleResolution

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

1
我还必须设置“目标”。 - Ron Newcomb

9

我的错误似乎是偶发的,但可能是由于编辑“node_modules”文件夹中的文件所导致。

我删除了:

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

运行…”npm install”

现在它可以工作。

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


2
没错,有时需要删除 node_modules,仅使用 npm install 并不足以强制重新安装。可以使用 npm install packagename 重新安装特定损坏的包,但这对于所有包都不起作用,并且无法解决所有依赖问题。没有充分理由的情况下不建议删除 package-lock.json,否则可能会带来新的问题,除非您知道问题是从那里传播的。 - Estus Flask

5

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

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

9
仅将依赖项添加到依赖关系中应该就足够了,它们也安装在开发模式下。 - Zmey
@Zmey,对我来说它只在devDependencies中起作用。 - Steve Tomlin

3

我曾经遇到过同样的问题,使用以下命令解决了它!

npm install -D tslib@latest


我觉得这并没有比那个最佳答案做出更多的贡献。 - starball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接