Skip to content
← Back to rules

typescript/no-extraneous-class 可疑

An auto-fix is available for this rule.

它的作用

当一个类没有任何非静态成员时,该规则会发出警告,例如仅用作静态命名空间的类。该规则还会报告那些仅有构造函数而没有字段的类。这些类通常可以被独立的函数所替代。

为什么这是不好的?

来自面向对象编程(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

参考资料