メインコンテンツにスキップ

avoid_futureor_void

実験的

FutureOrの結果の型として使用しない

詳細

#

FutureOr<void> を結果の型として使用することは避けてください。この型は、結果が Future<void> であるか、あるいは結果が破棄されるべきである(void の場合)かのいずれかであるとエンコードしているように見えるため、問題があります。しかし、どちらのケースであるかを安全に検出する方法はありません(void 型の式は、任意のオブジェクト、任意の型の Future を含む、どのようなオブジェクトにでも評価される可能性があるためです)。

「このオブジェクトは無視してください。また、Future かもしれないので注意してください」といった意味を持つ型を持つことは、概念的にも健全ではありません。

FutureOr<void> 型の反変的な出現(例えば、フォーマルパラメータの型の場合)については例外が設けられており、これらの出現に対しては警告は発行されません。この例外の理由は、その型が結果を記述するのではなく、他者から提供される値に対する制約を記述しているからです。同様に、型エイリアスの宣言についても例外が設けられています。これは、それらが反変的な位置(例えば、フォーマルパラメータの型として)で使用される可能性があるためです。したがって、型エイリアスの宣言では、型パラメータの境界のみがチェックされます。

多くの場合、FutureOr<void> 型の代替として便利に使用できるのは Future<void>? です。この型は、結果が Future<void> であるか、あるいは null であるかをエンコードし、実行時にはオブジェクトが両方の型を持つことはできないため、曖昧さがありません。

Future<void>? 型を FutureOr<void> 型の代替として常に使用できるとは限りません。なぜなら、後者はすべての型のスーパータイプであるのに対し、前者はそうではないからです。この場合、FutureOr<void>void 型で置き換えることが有用な解決策になることがあります。

悪い例

dart
FutureOr<void> m() {...}

良い例

dart
Future<void>? m() {...}

このルールは実験的なものです。評価中であり、変更または削除される可能性があります。その動作に関するフィードバックを歓迎します!主な問題はこちらにあります: https://github.com/dart-lang/sdk/issues/59232。

有効にする

#

avoid_futureor_void ルールを有効にするには、analysis_options.yaml ファイルの linter > rules の下に avoid_futureor_void を追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    - avoid_futureor_void

YAML マップ構文を使用してリンター ルールを構成している場合は、linter > rules の下に avoid_futureor_void: true を追加してください。

analysis_options.yaml
yaml
linter:
  rules:
    avoid_futureor_void: true