如何定义仅服务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
相关产品推荐
相关产品推荐

