prefer-function-type
コールシグネチャを持つインターフェースの代わりに、関数型を使用することを強制します。
🎨
拡張 "plugin:@typescript-eslint/スタイル"
を ESLint設定 で有効にすると、このルールが適用されます。
🔧
このルールによって報告される問題の一部は、 --fix
ESLintコマンドラインオプション.
によって自動的に修正できます。TypeScriptでは、関数の型を宣言する一般的な方法が2つあります。
- 関数型:
() => string
- シグネチャを持つオブジェクト型:
{ (): string }
関数型形式は、より簡潔であるため、可能な限り優先されます。
このルールは、単一のコールシグネチャを持つインターフェースまたはオブジェクト型リテラルの代わりに、関数型を使用することを提案します。
.eslintrc.cjs
module.exports = {
"rules": {
"@typescript-eslint/prefer-function-type": "error"
}
};
Playgroundでこのルールを試してみてください ↗
例
- ❌ 正しくない
- ✅ 正しい
interface Example {
(): string;
}
Playgroundで開くfunction foo(example: { (): number }): number {
return example();
}
Playgroundで開くinterface ReturnsSelf {
// returns the function itself, not the `this` argument.
(arg: string): this;
}
Playgroundで開くtype Example = () => string;
Playgroundで開くfunction foo(example: () => number): number {
return bar();
}
Playgroundで開く// returns the function itself, not the `this` argument.
type ReturnsSelf = (arg: string) => ReturnsSelf;
Playgroundで開くfunction foo(bar: { (): string; baz: number }): string {
return bar();
}
Playgroundで開くinterface Foo {
bar: string;
}
interface Bar extends Foo {
(): void;
}
Playgroundで開く// multiple call signatures (overloads) is allowed:
interface Overloaded {
(data: string): number;
(id: number): string;
}
// this is equivelent to Overloaded interface.
type Intersection = ((data: string) => number) & ((id: number) => string);
Playgroundで開くオプション
このルールは設定できません。
使用しない場合
スタイル上の理由から、単一のコールシグネチャを持つインターフェースまたは型リテラルを具体的に使用したい場合は、このルールを回避できます。
このルールには、`interface Function`などのグローバル拡張でトリガーされることが時々ある既知のエッジケースがあります。これらのエッジケースはまれであり、多くの場合、奇妙なコードの症状です。 インラインESLint無効化コメントを使用することをお勧めします。詳細は#454を参照してください。