promise-function-async
Promise を返す関数またはメソッドには async マークを付けることを要求します。
このルールで報告される一部の問題は、 --fix
ESLint コマンドラインオプション.
💭 このルールを実行するには 型情報
各関数が次のいずれかのみを返すようにします。
- リジェクトされた Promise、または
- Error オブジェクトをスローする。
対照的に、async
でない、Promise
を返す関数は、技術的にはどちらも可能です。これらの関数の結果を処理するコードは、多くの場合、両方のケースを処理する必要があり、複雑になる可能性があります。このルールのプラクティスでは、両方のケースを処理するコードを作成する必要性を排除します。
関数が
Promise
とPromise
でない型の union を暗黙的に返す場合、通常は間違いです。このルールはそのようなケースをフラグします。意図的なものである場合は、ルールをパスさせるために明示的に返り値の型を宣言してください。
module.exports = {
"rules": {
"@typescript-eslint/promise-function-async": "error"
}
};
プレイグラウンドでこのルールを試す ↗
例
このルールのコード例
- ❌ 不正
- ✅ 正しい
const arrowFunctionReturnsPromise = () => Promise.resolve('value');
function functionReturnsPromise() {
return Promise.resolve('value');
}
function functionReturnsUnionWithPromiseImplicitly(p: boolean) {
return p ? 'value' : Promise.resolve('value');
}
プレイグラウンドで開くconst arrowFunctionReturnsPromise = async () => Promise.resolve('value');
async function functionReturnsPromise() {
return Promise.resolve('value');
}
// An explicit return type that is not Promise means this function cannot be made async, so it is ignored by the rule
function functionReturnsUnionWithPromiseExplicitly(
p: boolean,
): string | Promise<string> {
return p ? 'value' : Promise.resolve('value');
}
async function functionReturnsUnionWithPromiseImplicitly(p: boolean) {
return p ? 'value' : Promise.resolve('value');
}
プレイグラウンドで開くオプション
このルールは次のオプションを受け付けます
type Options = [
{
/** Whether to consider `any` and `unknown` to be Promises. */
allowAny?: boolean;
/** Any extra names of classes or interfaces to be considered Promises. */
allowedPromiseNames?: string[];
checkArrowFunctions?: boolean;
checkFunctionDeclarations?: boolean;
checkFunctionExpressions?: boolean;
checkMethodDeclarations?: boolean;
},
];
const defaultOptions: Options = [
{
allowAny: true,
allowedPromiseNames: [],
checkArrowFunctions: true,
checkFunctionDeclarations: true,
checkFunctionExpressions: true,
checkMethodDeclarations: true,
},
];
allowAny
any
と unknown
を返す関数を無視するかどうか。追加の安全性を求める場合は、このオプションをオフにすることを検討してください。これにより、ルールが不正な Promise の動作をキャッチする能力が低下します。
{ "allowAny": false }
を使用したコード例
- ❌ 不正
- ✅ 正しい
const returnsAny = () => ({}) as any;
プレイグラウンドで開くconst returnsAny = async () => ({}) as any;
プレイグラウンドで開くallowedPromiseNames
非同期コードにグローバルに組み込まれた Promise
以外の構造を使用するプロジェクト向け。このオプションを使用すると、関数がチェックされる原因となるクラスまたはインターフェースの文字列名を指定できます。
{ "allowedPromiseNames": ["Bluebird"] }
を使用したコード例
- ❌ 不正
- ✅ 正しい
class Bluebird {}
const returnsBluebird = () => new Bluebird(() => {});
プレイグラウンドで開くclass Bluebird {}
const returnsBluebird = async () => new Bluebird(() => {});
プレイグラウンドで開くcheckArrowFunctions
アロー関数をチェックするかどうか。デフォルトは true
ですが、false
に設定すると無視できます。
checkFunctionDeclarations
スタンドアロンの関数宣言をチェックするかどうか。デフォルトは true
ですが、false
に設定すると無視できます。
checkFunctionExpressions
インラインの関数式をチェックするかどうか。デフォルトは true
ですが、false
に設定すると無視できます。
checkMethodDeclarations
クラスとオブジェクトリテラルのメソッドをチェックするかどうか。デフォルトは true
ですが、false
に設定すると無視できます。
使用しない場合
このルールは、常に関数を async
にする必要がある API を使用するプロジェクトでは有効にするのが難しい場合があります。このルールを完全に無効にする代わりに、特定の状況下での依存関係に関する問題を提起するとともに、ESLint disable コメントの使用を検討することができます。
型チェックされたリンターのルールは、従来のリンターのルールよりも強力ですが、型チェックされたリンティングの設定も必要です。型チェックされたルールを有効にした後にパフォーマンスの低下が発生した場合は、パフォーマンスのトラブルシューティングを参照してください。