typescript/no-extraneous-class 可疑
它的作用
当一个类没有任何非静态成员时,该规则会发出警告,例如仅用作静态命名空间的类。该规则还会报告那些仅有构造函数而没有字段的类。这些类通常可以被独立的函数所替代。
为什么这是不好的?
来自面向对象编程(OOP)范式的用户可能会将他们的工具函数包裹在一个额外的类中,而不是直接放在 ECMAScript 模块的顶层。在 JavaScript 和 TypeScript 项目中,这样做通常是不必要的。
- 包装类会增加代码的认知复杂度,但并不会带来任何结构上的改进
- 无论放在类中的内容(如工具函数),由于它们位于模块内,已经自然地组织好了。
- 作为替代方案,你可以通过
import * as ...导入整个模块,从而在一个对象中获取所有内容。
- 当你在输入属性名称时,IDE 对静态类或命名空间导入属性的提示能力较差。
- 当所有变量都集中在类中时,静态分析未使用变量等更困难(参见:在 TypeScript 中查找死代码(和死类型))。
该规则还会报告那些仅有构造函数而无字段的类。这些类通常可以被独立的函数所替代。
示例
以下为错误代码示例:
ts
class StaticConstants {
static readonly version = 42;
static isProduction() {
return process.env.NODE_ENV === "production";
}
}
class HelloWorldLogger {
constructor() {
console.log("Hello, world!");
}
}
abstract class Foo {}以下为正确代码示例:
ts
const version = 42;
const isProduction = () => process.env.NODE_ENV === "production";配置
此规则接受一个配置对象,包含以下属性:
allowConstructorOnly
type: boolean
default: false
允许仅包含构造函数的类。
allowEmpty
type: boolean
default: false
允许空类。
allowStaticOnly
type: boolean
default: false
允许仅包含静态成员的类。
allowWithDecorator
type: boolean
default: false
允许带有装饰器的类。
如何使用
要通过配置文件或 CLI 启用此规则,可以使用:
json
{
"rules": {
"typescript/no-extraneous-class": "error"
}
}bash
oxlint --deny typescript/no-extraneous-class