型注釈がないため、 'this'は暗黙的に型 'any'を持ちます


123

で有効にするnoImplicitThistsconfig.json、次のコードでこのエラーが発生します。

'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');
});

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


更新:thisコールバックに型付けされたものを追加すると、実際にエラーが解決されます。の型注釈付きの矢印関数を使用していたため、エラーが発生しましたthis

typescriptプレイグラウンド


TypeScript 2.1またはナイトリーバージョンでこれを試しましたか?
Daniel Rosenwasser 2017年

@DanielRosenwasser 2.1.4
tony19

そして、WebStormとTSプレイグラウンドが不平を言っている理由がわかりthisます。
tony19 2017年

2
私はここにバグを報告しました:github.com/Microsoft/TypeScript/issues/13768-遠慮なく追跡して、高く評価してください。
Daniel Rosenwasser 2017年

回答:


139

エラーは確かに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の問題は、コンパイラのエラーメッセージを改善しthis、矢印関数を使用して実際の文法エラーを強調するために作成されました。


コンストラクタで「this」を使用する場合、「this」にはどの型注釈が必要ですか?
BluE

@BluEメンバープロパティ/関数が参照されていると仮定すると、this初期化されるクラスのタイプになります。たとえば、constructorがクラスのMyClass場合、の型注釈はにthisなりますMyClass
tony19
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.