如何用打字稿解决lerna monorepo中sequelize和angular的冲突?

How to solve conflict between sequelize and angular in lerna monorepo with typescript?

我有 lerna 的 monorepo。在我的项目中,我有 nodejs 和 angular。

Angular 使用 "typescript": "~3.5.3".

Nodejs 有这些包可以与 sequelize 一起使用:

"@types/node": "^12.12.16",
"@types/validator": "^12.0.1",
"reflect-metadata": "^0.1.13",
"sequelize": "^5.21.2",
"sequelize-typescript": "^1.1.0"

问题是我遇到了错误:

ERROR in [at-loader] ..\..\node_modules\sequelize\types\lib\transaction.d.ts:33:14
    TS1086: An accessor cannot be declared in an ambient context.

根据 我需要升级到 3.7.3。当我升级时,它在 nodejs sequelize 方面工作正常。

但是当我将打字稿更改为 3.7.3 时,angular 不起作用:

ERROR in The Angular Compiler requires TypeScript >=3.4.0 and <3.6.0 but 3.7.3 was found instead.

我该怎么做才能解决这个问题?

我可以为你修复这个错误,但是你应该把你的项目分开,因为很难维护一个前端和后端的monorepo。这不会是你最后一次依赖冲突。

Angular 8.x 卡在 TypeScript 3.5 上,但我在网上阅读的所有内容都说它将 okay 使用最新的 TypeScript 3.7 编译,并且Angular据报道,由于 Ivy,9 也将以 3.7 为目标。

您必须禁用 Angular 编译器对 TypeScript 版本的强制执行:

tsconfig.json:

{
  // ...
  "angularCompilerOptions": {
    // ...
    "disableTypeScriptVersionCheck": true
  }
}

这将使项目编译,但你会得到一个 运行 时间错误,因为 Angular 8 没有定义默认导入程序。我们可以通过向 polyfills

添加一个来解决这个问题

polyfills.ts:

// @ts-ignore
window.__importDefault = function(mod) {
  return mod && mod.__esModule ? mod : { default: mod };
};

稍后升级到Angular 9. 上面的操作可以取消,应该用TypeScript 3.7编译