Skip to content
← Back to rules

typescript/prefer-function-type スタイル

🛠️ An auto-fix is available for this rule for some violations.

何をするか

関数型ではなく、呼び出しシグネチャを持つインターフェースを使用しないように制約します。

なぜこれは悪いのか

TypeScript では、関数の型を宣言するための2つの一般的な方法があります:

  • 関数型:() => string
  • シグネチャを持つオブジェクト型:{ (): string }

可能な限り、関数型の形式がより簡潔で読みやすく、推奨されます。呼び出しシグネチャのみを持つインターフェースは、追加の機能を提供せずに不要な冗長性をもたらします。

このルールに違反する 誤り のコード例:

typescript
interface Example {
  (): string;
}

function foo(example: { (): number }): number {
  return example();
}

interface ReturnsSelf {
  (arg: string): this;
}

このルールに従った 正しい コード例:

typescript
type Example = () => string;

function foo(example: () => number): number {
  return example();
}

// 関数自体を返すものであり、`this` 引数ではない
type ReturnsSelf = (arg: string) => ReturnsSelf;

// 複数のプロパティが許可される
function foo(bar: { (): string; baz: number }): string {
  return bar();
}

// 複数の呼び出しシグネチャ(オーバーロード)が許可される
interface Overloaded {
  (data: string): number;
  (id: number): string;
}

// これは `Overloaded` インターフェースと同等。
type Intersection = ((data: string) => number) & ((id: number) => string);

使い方

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

json
{
  "rules": {
    "typescript/prefer-function-type": "error"
  }
}
bash
oxlint --deny typescript/prefer-function-type

参照