Skip to content
← Back to rules

typescript/no-empty-object-type 制限

An auto-fix is available for this rule.

何を行うか

{} 型が任意の非 null かつ非 undefined 値を許可するため、混乱を避けるためにこのルールは {} 型の使用を禁止します。これにはフィールドのないインターフェースやオブジェクト型エイリアスも含まれます。

なぜ悪いのか?

TypeScript における {}(「空のオブジェクト」型)は、構造的型付けの仕組みに馴染みのない開発者にとって、よくある誤解の原因となります。{} は、0 や "" のようなリテラルを含む、すべての非 null かつ非 undefined 値を表します。 多くの場合、開発者が {} を書いているのは、実際には次のような意図であることが多いです:

  • object:任意のオブジェクト値を表す
  • unknownnullundefined も含めたすべての値を表す

言い換えると、「空のオブジェクト」型 {} とは、「定義されている任意の値」を意味しています。これは配列、クラスインスタンス、関数、文字列やシンボルなどのプリミティブも含みます。

このルールが報告しないケースは以下の通りです:

  • 複合型(インターセクション型)内の {} としての型成分(例:TypeScript の組み込み型 type NonNullable<T> = T & {} のような型)、これは型システム操作において有用な場合があるため
  • 複数の他のインターフェースから継承しているインターフェース

このルールに対して不正なコードの例:

ts
let anyObject: {};
let anyValue: {};
interface AnyObjectA {}
interface AnyValueA {}
type AnyObjectB = {};
type AnyValueB = {};

このルールに対して正しいコードの例:

ts
let anyObject: object;
let anyValue: unknown;
type AnyObjectA = object;
type AnyValueA = unknown;
type AnyObjectB = object;
type AnyValueB = unknown;
let objectWith: { property: boolean };
interface InterfaceWith {
  property: boolean;
}
type TypeWith = { property: boolean };

設定

このルールは以下のプロパティを持つ設定オブジェクトを受け入れます。

allowInterfaces

type: "never" | "always" | "with-single-extends"

default: "never"

空のインターフェースを許可するかどうか。

許可される値は以下の通りです:

  • 'always':フィールドのないインターフェースを常に許可する
  • 'never' (デフォルト):フィールドのないインターフェースを決して許可しない
  • 'with-single-extends':1つのベースインターフェースから extend している空のインターフェースを許可する

{ allowInterfaces: 'with-single-extends' } を使用したこのルールに対する正しいコードの例:

ts
interface Base {
  value: boolean;
}
interface Derived extends Base {}

allowObjectTypes

type: "never" | "always"

default: "never"

空のオブジェクト型リテラルを許可するかどうか。

許可される値は以下の通りです:

  • 'always':フィールドのないオブジェクト型リテラルを常に許可する
  • 'never' (デフォルト):フィールドのないオブジェクト型リテラルを決して許可しない

allowWithName

type: string

設定された名前を持つインターフェースおよびオブジェクト型エイリアスを許可するための文字列化された正規表現。

既存のコードスタイルで {} ではなく object を使って空の型を宣言するパターンがある場合に役立ちます。

{ allowWithName: 'Props$' } を使用したこのルールに対する不正なコードの例:

ts
interface InterfaceValue {}
type TypeValue = {};

{ allowWithName: 'Props$' } を使用したこのルールに対する正しいコードの例:

ts
interface InterfaceProps {}
type TypeProps = {};

使用方法

このルールを有効化するには、設定ファイルまたは CLI で次のように使用できます:

json
{
  "rules": {
    "typescript/no-empty-object-type": "error"
  }
}
bash
oxlint --deny typescript/no-empty-object-type

参照