'this' tiene implícitamente el tipo 'any' porque no tiene una anotación de tipo


124

Cuando activo noImplicitThisen tsconfig.json, consigo este error para el siguiente código:

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

Agregar un tipo thisa los parámetros de devolución de llamada da como resultado el mismo error:

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

Una solución alternativa es reemplazar thiscon el objeto:

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

Pero, ¿cuál es la solución adecuada para este error?


ACTUALIZACIÓN: Resulta que agregar un escrito thisa la devolución de llamada soluciona el error. Veía el error porque estaba usando una función de flecha con una anotación de tipo para this:

patio de recreo mecanografiado


¿Intentaste esto en TypeScript 2.1 o en la versión nocturna?
Daniel Rosenwasser

@DanielRosenwasser 2.1.4
tony19

Y ahora veo la razón por la que WebStorm y TS playground se quejaban: estaba usando una función de flecha mientras proporcionaba una anotación de tipo para this.
tony19

2
Presenté un error aquí: github.com/Microsoft/TypeScript/issues/13768 - siéntase libre de rastrearlo y dar un pulgar hacia arriba.
Daniel Rosenwasser

Respuestas:


139

De hecho, el error se corrige insertando thisuna anotación de tipo como primer parámetro de devolución de llamada. Mi intento de hacer eso fue un fracaso al cambiar simultáneamente la devolución de llamada en una función de flecha:

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

Debería haber sido esto:

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

o esto:

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

Se creó un problema de GitHub para mejorar el mensaje de error del compilador y resaltar el error gramatical real con thisy arrow-functions.


¿Qué tipo de anotación debe tener 'this', si usa 'this' en el constructor?
BluE

@BluE Suponiendo que se hace referencia a una propiedad / función de miembro, thissería el tipo de clase que se inicializa. Por ejemplo, si constructores para la clase MyClass, el tipo de anotación para thissería MyClass.
tony19
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.