this引数 (this parameter)
アロー関数以外の関数とクラスのメソッドの第1引数はthis
という特殊な引数を受けることができます。これは使用するコンテキストによってthis
の意味するところが変わってしまうため、これらがどのコンテキストで使用されるべきなのかをTypeScriptに伝えるために使います。このthis
は呼び出す側は意識する必要はありません。第2引数以降を指定してください。
ts
classMale {privatename : string;public constructor(name : string) {this.name =name ;}publictoString (): string {return `Monsieur ${this.name }`;}}classFemale {privatename : string;public constructor(name : string) {this.name =name ;}publictoString (this :Female ): string {return `Madame ${this.name }`;}}
ts
classMale {privatename : string;public constructor(name : string) {this.name =name ;}publictoString (): string {return `Monsieur ${this.name }`;}}classFemale {privatename : string;public constructor(name : string) {this.name =name ;}publictoString (this :Female ): string {return `Madame ${this.name }`;}}
上記クラスMale
、Female
はほぼ同じ構造ですがtoString()
のメソッドの引数が異なります。
Male
、Female
はともに普通の用途で使うことができます。
ts
constmale :Male = newMale ("Frédéric");constfemale :Female = newFemale ("Frédérique");male .toString ();female .toString ();
ts
constmale :Male = newMale ("Frédéric");constfemale :Female = newFemale ("Frédérique");male .toString ();female .toString ();
ですが各インスタンスのtoString()
を変数に代入すると意味が変わります。
ts
constmaleToStr : () => string =male .toString ;constfemaleToStr : (this :Female ) => string =female .toString ;maleToStr ();The 'this' context of type 'void' is not assignable to method's 'this' of type 'Female'.2684The 'this' context of type 'void' is not assignable to method's 'this' of type 'Female'.femaleToStr ();
ts
constmaleToStr : () => string =male .toString ;constfemaleToStr : (this :Female ) => string =female .toString ;maleToStr ();The 'this' context of type 'void' is not assignable to method's 'this' of type 'Female'.2684The 'this' context of type 'void' is not assignable to method's 'this' of type 'Female'.(); femaleToStr
femaleToStr()
のコンテキストがFemale
ではないとの指摘を受けています。このコードを実行することはできません。ちなみにこの対応をしていないmaleToStr()
は実行こそできますが実行時に例外が発生します。
js
classMale {// ...toString () {return `Monsieur ${this.name }`;}}
js
classMale {// ...toString () {return `Monsieur ${this.name }`;}}
引数のthis
を指定することによって意図しないメソッドの持ち出しを避けることができます。