【问题标题】:TypeScript: Reuse of interfaces and classes for frontend (Angular) and backendTypeScript:重用前端(Angular)和后端的接口和类
【发布时间】:2019-04-07 21:12:49
【问题描述】:

我有一个基于前端(Angular)和后端(使用 NestJS 开发 - 所以它是 NodeJS)的当前项目的 monorepo。我想为前端和后端使用自定义接口和类。例如,创建 DTO 以便我的前端知道我的后端的参数。

我想过一个公共文件夹,如下面的项目结构所示,但这不起作用,因为公共文件夹超出了 Angular (tsconfig) 的范围,因此自动完成不起作用

project
├── client (Angular)
├── server (NestJS)
└── common (client and server share specific interfaces and classes)

有人有这方面的经验吗?目前我将我的接口添加到两个文件夹中,但这很糟糕,因为如果我更新一个接口,我也必须替换另一个。

【问题讨论】:

  • 试试这个资源:angularfirebase.com/lessons/…
  • 谢谢,但将其导出为 tgz 文件或上传到 npm(公共或私有)以在外部使用它并不好。也许没有npm还有另一种选择
  • 引入了 angular 6 monorepo 支持。您应该升级到 ng6+ 并将您的接口移动到 ng 库。那么你应该能够在两个项目中使用它们。将它们放在文件夹结构的第一层是不可能的,因为它必须在角度范围内才能使其与角度 cli 一起使用。当然,您也可以将它们放在 npm 模块中。
  • 服务器不是 Angular 项目,所以这不起作用

标签: angular typescript


【解决方案1】:

在 TypeScript 3.0 中引入了“项目引用”。这可以帮助你实现你想要的(我用它在角度和云函数之间共享模型)

https://www.typescriptlang.org/docs/handbook/project-references.html

你需要做的是添加一个外部项目引用到项目的tsconfig.json 应该重用其他地方的文件

{
  "compilerOptions": {
    // The usual config
  },
  "references": [
    { "path": "../my-other-project" }
  ]
}

【讨论】:

  • 我在几周前尝试过,但没有成功。我也没有找到任何显示工作示例的项目或 Github 存储库
  • 嗨,这个 repo 怎么样?这似乎是一个有用的例子github.com/RyanCavanaugh/project-references-demo
  • package.json 丢失,所以我无法验证它是否有效。如果我使用项目引用,则在我的项目中自动完成不起作用
【解决方案2】:

在您的 tsconfig.json 中添加 common 到 paths 属性:

     "paths": {
       "@angular/*": ["node_modules/@angular/*"],
       "rxjs/*": ["node_modules/rxjs/*"],
       "common/*": ["../common/*"]
     }

然后: import myInterface from 'exported interface in common folder';

最好有一个 index.ts 导出所有服务,接口什么的: export * from './myFile'

【讨论】:

【解决方案3】:

Lerna 之类的工具有助于进行这种设置,根据经验,这是最简单的方法,无需创建任何私有 npm 存储库(这是另一种选择)。

本质上,您设置 Angular 和服务器包以安装通用包,就像任何其他 npm 包一样,并运行 lerna 为每个包创建虚拟链接。 这样,当您需要它们进行智能感知时,编辑器将通过 lerna 在引导阶段创建的虚拟文件链接,从而允许您创建任意数量的通用包,而无需做任何繁重的工作来连接所有消费者包。

【讨论】:

  • Lerna 是目前最简单且(对我而言唯一)可行的解决方案
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 2021-04-10
  • 2021-06-16
  • 1970-01-01
  • 2020-05-20
  • 1970-01-01
  • 2021-05-05
  • 2020-09-16
相关资源
最近更新 更多