Skip to content
← Back to rules

typescript/no-extraneous-class Suspicious

⚠️💡 A dangerous suggestion is available for this rule.

何を検出するか

このルールは、静的メンバー以外のメンバが存在しないクラス(例:静的ネームスペースとしてのみ使用されるクラス)を報告します。また、フィールドがなく、コンストラクタだけを持つクラスも報告します。これらのクラスは一般的にスタンドアロンの関数で置き換えることができます。

なぜ問題なのか

オブジェクト指向プログラミング(OOP)のパラダイムに慣れているユーザーは、ユーティリティ関数をトップレベルの ECMAScript モジュールに直接定義する代わりに、追加のクラスでラップしてしまうことがあります。これは JavaScript や TypeScript プロジェクトでは一般的に不要です。

  • ラッパークラスは構造的な改善を加えずに、コードに対する認知負荷を増加させます。
    • 例えば、ユーティリティ関数などは、すでにモジュール内にあるという事実によって自然に整理されています。
    • 代わりに、import * as ... を使ってモジュール全体を1つのオブジェクトとしてインポートできます。
  • インテグレーテッド開発環境(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

参考資料