web-dev-qa-db-ja.com

型注釈がないため、「this」は暗黙的に「any」型になります。

tsconfig.jsonnoImplicitThisを有効にすると、次のコードでこのエラーが発生します。

'this' implicitly has type 'any' because it does not have a type annotation.
class Foo implements EventEmitter {
  on(name: string, fn: Function) { }
  emit(name: string) { }
}

const foo = new Foo();
foo.on('error', function(err: any) {
  console.log(err);
  this.emit('end');  // error: `this` implicitly has type `any`
});

型指定されたthisをコールバックパラメータに追加すると、同じエラーが発生します。

foo.on('error', (this: Foo, err: any) => { // error: `this` implicitly has type `any`

回避策は、thisをオブジェクトに置き換えることです。

foo.on('error', (err: any) => {
  console.log(err);
  foo.emit('end');
});

しかし、このエラーに対する適切な修正は何ですか?


UPDATE:コールバックに型付きのthisを追加すると、エラーに対処できます。 thisの型注釈付きの矢印関数を使用していたため、エラーが発生しました。

TypeScript playground

80
tony19

最初のコールバックパラメータとして型注釈付きのthisを挿入することで、このエラーは確かに修正されます。それを試みる私の試みは、コールバックを同時に矢印関数に変更することによって妨げられました。

foo.on('error', (this: Foo, err: any) => { // DON'T DO THIS

それはこれだったはずです:

foo.on('error', function(this: Foo, err: any) {

またはこれ:

foo.on('error', function(this: typeof foo, err: any) {

GitHub issue はコンパイラのエラーメッセージを改善し、thisとarrow-functionsで実際の文法エラーを強調するために作成されました。

88
tony19