lap*_*rof 13 javascript node.js lombok typescript
我正在寻找一种方法来减少 NodeJS 后端的样板代码。在 Lombok 中,例如可以通过对象的注释注入构造函数和 getter/setter。
有没有办法在 TypeScript 中做到这一点?
Dan*_*cák 17
我赶紧用Google搜索了一下,发现项目一样,这其中试图将龙目岛般的能力,以打字稿,但你可以看到,这些项目都是稀缺的,不是广泛使用。这意味着一个问题:你为什么想要这样的工具?
TS 在减少样板文件方面已经很不错了。当我定义一个类时,我通常这样做:
class A {
constructor(private fieldA: string, private readonly fieldB = 0) {}
}
Run Code Online (Sandbox Code Playgroud)
这很简洁,不是吗?我猜您正在将 TS 的功能与 Java 的功能进行比较。Java 非常冗长,而 Lombok 对此有很大帮助。但是 TS 和 JS 是不同的,虽然 Lombok 解决的一些问题已经被 TS 解决了,但其他问题在 TS 和 JS 的世界中都不是问题。
首先,上面的语法创建了某些类型的类字段,带有访问修饰符,您还可以readonly在前面找到关键字fieldB及其默认值0。最重要的是,这些是与构造函数一起创建的,该构造函数在执行时隐式地为实例字段赋值(请参阅,没有this.fieldA = fieldA)。因此,这已经超出了 Lombok 注入构造函数的能力。请注意:在 JS 中(因此在 TS 中),您只能有一个构造函数。JS 不支持方法重载。
现在关于 getter/setter,它们在 JS(或 TS)中的使用方式与在 Java 中的使用方式不同。在 JS 中,您直接使用字段是一种规范,并且 setter 和 getter 仅在您想要的特殊情况下使用:
readonly并且编译器将确保您不分配给该属性 - 无需使用 getter。如果您在没有编译时检查的情况下使用 JS 进行开发,则约定是用下划线标记私有属性(您绝对不应该修改的属性)。无论哪种方式,您仍然可能会修改一个您不应该修改的变量,但与 Java 不同,这不被认为是在 JS(和 TS)中随处使用 get/set 的充分理由。相反,如果您真的需要确定在运行时不会发生任何修改,您可以使用前面提到的不带 setter 的 getter,或者将对象的属性配置为不可写。()在 getter 名称之后使用。现在因为这个逻辑是自定义的,所以不能仅仅通过使用注释来生成。正如您所看到的,Lombok 在 Java 中处理的一些问题已经在 TS 中处理了,而其他问题则不是问题。
编辑 5-9-2021 - 回答@Reijo 的问题: Lomboks 功能超越了 getter/setter/constructors。查看@Builder 注释,我对您对此的看法很感兴趣。
如果问题只是关于是否有一个 TypeScript/JavaScript 库提供或多或少与 Lombok for Java 相同的实用程序集合,那么据我所知,答案是否定的。我认为部分原因是 TypeScript 提供了开箱即用的功能(正如我在上面概述的那样),这让我回到了 Java 比 TypeScript 或 Groovy 之类的语言更需要 Lombok 的观点。当你需要 TS 没有提供的东西时,比如构建器模式,你可以使用库来解决特定的问题,比如构建器模式(在其核心使用 JS 代理)或者由于 JS 的灵活性(实际上是 TS ) 自己轻松编写。
这一切都很好,但您可能希望以更具声明性的方式添加功能 - 通过注释(在 TS 世界中,这些被称为装饰器,它们的工作方式不同),正如 Lombok 所做的那样。这可能很复杂。
首先,如果您通过 TS 中的装饰器修改类型,则 TS 编译器无法识别该更改。因此,如果您通过在装饰器中向类添加方法来扩充类,TS 将无法识别该新方法。有关详细信息,请参阅此讨论。
这意味着您要么放弃装饰器并使用函数来修改类型(您可以这样做),要么深入研究 AST。这就是 Lombok 的工作方式。它在称为注释处理的编译阶段采用带注释的类型,并且由于 javac(和 Eclipse 编译器)中的 hack 修改了它们的 AST(例如,为给定的类创建内部构建器)。可以用 TS/JS 以一种有点类似的方式来做到这一点。
尽管在 TS 或 JS 中没有像注释处理这样的东西,但您仍然可以创建一个构建步骤,该步骤采用源代码并修改它的 AST 以实现您的目标(这也是 Babel 的工作方式)。这可能会导致向类添加方法,基于所使用的注释(广义上 - 不一定是装饰器)生成构建器等。
不过,这种方法是一个挑战。除了 AST 是一个高级主题,即使你让它工作,你也需要来自 IDE 的支持,现在这也意味着来自语言服务器的支持。这不适合胆小的人。
但是,如果您打算为 TS 创建类似 Lombok 的东西,我的编辑不应该吓跑任何人,因为似乎有些人希望在 TS/JS 世界中看到它。它应该只向您展示未来的情况;)。
| 归档时间: |
|
| 查看次数: |
5126 次 |
| 最近记录: |