問題の歴史:
JavaScriptはbind、call、applyメソッドを使用して、コンテキスト(this)や引数を渡すことを許可しています。TypeScript 3.2が登場する前は、これらのメソッドはあまり厳密には扱われず、引数には余分な値や無効な値が許可されることが多く、実行時エラーが発生する原因となっていました。TypeScriptはstrictBindCallApplyパラメータを実装し、これらのメソッドのシグネチャに対して厳格なチェックを追加しました。
問題:
厳格な型付けがない状態では、bind/call/applyメソッドは余分な、欠落、および型が一致しない引数がコンパイル時エラーなしに「通過」することを許可していました。
解決策:
strictBindCallApplyを有効にすると、TypeScriptコンパイラは以下を厳密に要求します:
コード例:
function sum(a: number, b: number): number { return a + b; } const sum2 = sum.bind(null, 1); sum2(2); // OK sum2(2, 3); // strictBindCallApplyでエラー
主要な特徴:
strictBindCallApplyは関数のみに適用されるのか、それともクラスのメソッドにも影響を与えるのか?
関数にもメソッドにも影響があります。なぜなら、bind/call/applyメソッドはすべての関数(Function.prototype)で利用できるからです。これは独立した関数にも、クラスのメソッドにも該当します。
strictBindCallApplyパラメータはstrictモードなしで有効にすることはできるのか?
いいえ、有効にするにはstrict=trueまたはtsconfig.jsonにstrictBindCallApply=trueを直接指定する必要があります。
bindを介して引数を元の関数よりも多く渡した場合、何が起こるか?
strictBindCallApplyが有効な状態でTypeScriptコンパイラはエラーを出します:「Expected X arguments, but got Y」。これは、引数の多いシグネチャや誤って余分な変数をキャッチする一般的なエラーから保護します。
** ネガティブケース 開発者は引数を部分的に適用するために.bindを使用しますが、数が間違っています。通常のモードではエラーはありませんが、プロダクション環境で関数が余分な引数で呼び出され、ロジックが壊れてしまいます。
利点:
欠点:
** ポジティブケース strictBindCallApplyが有効で、関数とメソッドがシグネチャに厳密にbindを使用します:余分または無効な引数はコンパイル時に排除されます。
利点:
欠点: