You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何定义仅服务ESLint的无运行时污染TypeScript装饰器?求替代方案

实现编译后无残留的TypeScript标记方案(用于ESLint规则)

你需要的是仅在开发阶段提供静态标记、编译后完全无残留的方案,以下两种方案可以满足需求,比你当前的实现更简洁优雅:

方案一:仅类型声明的空装饰器

直接用declare定义装饰器的类型签名,不提供具体实现,TypeScript编译时会完全忽略这个装饰器的调用,不会生成任何相关代码:

// 仅定义类型,无实际实现
declare function eslintMark(): PropertyDecorator & MethodDecorator;

class ExampleClass {
  @eslintMark()
  method() {}

  @eslintMark()
  property: string;
}

编译后的JS代码会自动去掉装饰器,完全符合你的预期:

class ExampleClass {
    method() {}
}

这种方案保留了装饰器的语法直观性,同时完全避免了运行时代码残留,只需要确保你的ESLint规则能识别这个装饰器的存在即可。

方案二:JSDoc标签标记

用JSDoc自定义标签做静态标记,完全不需要额外的代码,ESLint可以通过解析注释中的标签来识别目标属性/方法:

class ExampleClass {
  /**
   * @eslint-mark
   */
  markedProperty: string;

  /**
   * @eslint-mark
   */
  method() {}

  constructor() {
    this.markedProperty = "Hello";
  }
}

这种方案的优势是零代码侵入,编译后不会留下任何痕迹,完全依赖ESLint的JSDoc解析能力来实现规则校验,适合仅需要静态标记的场景。

方案对比

  • 装饰器方案:语法更贴合TypeScript的装饰器使用习惯,适合已经在项目中使用装饰器的场景,但需要确保装饰器仅做类型声明。
  • JSDoc方案:完全无运行时开销,不需要配置装饰器相关的编译选项,适合追求极简、无代码侵入的场景。

内容的提问来源于stack exchange,提问作者Andre Elrico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 15:01:24