Programmingフルスタック開発者

コールバック関数を実装し、オプションのパラメータまたはデフォルト値を持つ場合の正しい型指定をどのように行いますか?どのような問題が発生する可能性があり、それを回避するにはどうすればよいですか?

Hintsage AIアシスタントで面接を突破

回答。

質問の背景:

コールバック関数は、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はエラーを出します—パラメータが必須であれば、それは渡さなければなりません。オプションまたはデフォルト値のものだけが省略可能です。

タイプエラーとアンチパターン

  • オプションと必須パラメータの順序の混乱(最初に必須、次にオプション)。
  • 型指定の欠如または "any" の使用 — TypeScriptの利点を失います。
  • 値の代わりにundefinedを渡そうとし、デフォルト値の発動を期待する(引数がない場合にのみ発動します)。

実生活の例

ネガティブケース

コールバックの2番目の引数を必須と指定し、呼び出し時にそれを渡さなかった。コンパイルエラーを受けました。

利点:

  • 明確にされていないコードが迅速かつ簡単に書かれました。

欠点:

  • コンパイルされません。
  • 柔軟性を失い、責任が混乱します。

ポジティブケース

オプションのパラメータを持つコールバックを型付けしました:

(cb: (x: number, y?: number) => void)

またはデフォルトを設定しました:

f = (x: number, y = 10) => { ... }

利点:

  • コールバックの呼び出し時にエラーがないことが保証されます。
  • 可読性と保守性があります。

欠点:

  • パラメータの順序に注意を払う必要があります。