質問の背景:
コールバック関数は、JSやTSにおける非同期プログラミングと責任の委譲のための一般的な手法です。TypeScriptにおけるこのような関数の型指定は、安全性を確保するための重要な部分であり、特にパラメータがオプションまたはデフォルト値を持つ場合です。
問題:
動的なJSでは、コールバック引数の型指定がないと、値の伝達エラーやundefinedとの混乱、パラメータの順序の誤りが発生します。TypeScriptでは、同様の問題を回避するために型指定が必要ですが、外部ではオプション性、順序、デフォルト値に関するすべてのニュアンスを守るのは難しいです。
解決策:
すべてのパラメータの型を明示的に指定し、オプションのパラメータには疑問符を付け、デフォルト値は関数の宣言時に明示的に指定し、それを型に正しく反映させることを忘れないでください。
コード例:
function fetchData( url: string, callback: (data: any, error?: Error) => void ) { // ... } // オプションのパラメータ error を持つコールバック fetchData('/api', (data, error) => { if (error) { // 処理 } else { // 成功 } }); // デフォルトパラメータを持つコールバック function process( cb: (x: number, y?: number) => void = (x, y = 10) => { /* ... */ } ) { /* ... */ }
主な特徴:
コールバックの消費者は、オプションを含むすべてのパラメータを明示的に考慮する必要がありますか?
いいえ、オプションのパラメータは省略でき、TypeScriptはエラーを出しません—疑問符の構文のおかげで処理は正しく行われます。
コールバックの最初のパラメータをオプションにし、2番目を必須にすることはできますか?
いいえ。オプションのパラメータは常に引数リストの最後に来る必要があります。順序を破ると型指定のエラーが発生します。
オプション性を示さず、呼び出し時にパラメータを渡さないとどうなりますか?
TypeScriptはエラーを出します—パラメータが必須であれば、それは渡さなければなりません。オプションまたはデフォルト値のものだけが省略可能です。
コールバックの2番目の引数を必須と指定し、呼び出し時にそれを渡さなかった。コンパイルエラーを受けました。
利点:
欠点:
オプションのパラメータを持つコールバックを型付けしました:
(cb: (x: number, y?: number) => void)
またはデフォルトを設定しました:
f = (x: number, y = 10) => { ... }
利点:
欠点: