'这'隐含地具有类型' any'因为它没有类型注释

时间:2017-01-30 20:16:20

标签: typescript typescript2.0

当我在noImplicitThis中启用tsconfig.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');
});

但是这个错误的正确解决方法是什么?

UPDATE:事实证明,在回调中添加一个类型this确实可以解决错误。我看到了错误,因为我使用的箭头函数带有this的类型注释:

typescript playground

3 个答案:

答案 0 :(得分:86)

通过插入带有类型注释的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和箭头函数突出显示实际的语法错误。

答案 1 :(得分:1)

对于方法装饰器声明 使用配置 "noImplicitAny": true, 您可以根据@tony19 的回答明确指定此变量的类型

function logParameter(this:any, target: Object, propertyName: string) {
  //...
}

答案 2 :(得分:0)

你可以添加

 "noImplicitAny": false,

tsconfig.json

照原样here