TypeScriptでは、関数のシグネチャでthisの型を明示的に指定することができます。これは、オブジェクトやクラスのメソッドに使用され、呼び出しコンテキストの正しい型付けを保証します。
thisの型指定の例:
interface Person { name: string; greet(this: Person): void; } const person: Person = { name: 'Max', greet() { console.log(`Hello, ${this.name}!`); } };
関数の場合、thisの型を明示的に指定することができます。それは最初の名前のないパラメータとして扱われます:
function showName(this: { name: string }) { console.log(this.name); }
矢印関数の特徴:
なぜこれが必要なのか? 对象のメソッドの不適切な使用を捕捉することを可能にし、イベントハンドラーなどのランタイム「バインディング」を適切に行うのを助けます。
矢印関数にthisの型を明示的に指定することは可能ですか? どこに問題がありますか?
答え: できません。矢印関数は外部コンテキストからthisをキャプチャするため、ECMAScriptの仕様では内部に独自のthis値は存在しません。
const foo = (this: any) => {} // コンパイルエラー
thisを制御する必要がある場合は、通常の(function)関数を使用してください。
事例
事例
setTimeout(obj.method, 1000))にthisが失われ、ランタイムエラーが発生しました。bindまたは矢印関数を使用してコンテキストを固定することを忘れました。事例
データモデル操作のライブラリで、interfaceのメソッドにthisの型を指定し忘れました。TypeScriptは不適切なコンテキストでのメソッド呼び出しに対してエラーを示しませんでしたが、プロダクション環境では存在しないプロパティにアクセスする際にアプリケーションがクラッシュしました。