引用外部打字稿文件时如何避免"Module not found: Error: Can't resolve 'tslib'"错误?



问题

我有一个客户端/服务器应用程序,其中客户端是一个角度应用程序。服务器确实为其提供的 API 提供了几个打字稿定义。这些定义是从项目外部文件夹加载的。到目前为止,这工作正常,但是现在我正在从 Angular 7 升级到 Angular 8(并且还将 Typescript 从版本 3.1 升级到 3.5(,当尝试使用定义中的非静态枚举时,现在会产生此错误:

找不到模块:错误:无法解析"/路径/到/服务器/定义"中的"tslib">

api.ts文件位于客户端目录中时,一切正常。

为什么会发生这种情况,我能做些什么?

创建最小可重现的示例

下面是一个快速脚本,用于创建要重现的最小示例:

mkdir project
cd project
ng new client --minimal=true --skipGit=true --routing=false --style=css
mkdir server
echo 'export enum ApiSample { X = "X" }' > server/api.ts
sed -i 's/"compilerOptions": {/"compilerOptions": {"paths":{"api":["../server/api"]},/' client/tsconfig.json
sed -i -e "1iimport { ApiSample } from 'api';" -e "s/title = 'client';/title = 'client' + ApiSample.X;/" client/src/app/app.component.ts
cd client
npm start

或者,手动创建示例:

  1. 创建新的角度项目
  2. 在文件系统中的某个位置创建一个包含内容的文件"api.ts"export enum ApiSample { X = "X" }
  3. 在"tsconfig.json"中添加{"paths":{"api":["/path/to/server/api"]}compilerOptions
  4. 从角度项目的任何文件访问ApiSample.X
  5. 运行npm start

迄今为止的调查结果

  • 迁移器在 tsconfig.json 中添加了"importHelpers": true。这就是为什么它以前有效,现在不再工作的原因。在tsconfig.json中指定"importHelpers": false可以解决此问题,但是当然此选项是有原因的,因此这不是最终的解决方案
  • 显式指定"tslib": ["node_modules/tslib"]可以解决此问题。这可能是最终的解决方案,尽管了解究竟发生了什么以及记录在哪里会很有趣。

Angular 8&9

因此,对于 Angular 8 和 9,似乎在 tsconfig.json 中添加compilerOptions/paths"tslib": ["node_modules/tslib"]可以解决问题。

角度 10

在 Angular 10 中,问题完全消失了,不再需要解决方法。

相关内容

最新更新