打字稿:为什么它不治疗这个'作为Javascript?

时间:2017-03-01 08:34:02

标签: javascript typescript this

我写了以下代码:

export class ClickHandlers {
    static entityNameClickHandler(id) {
       console.log("EntityNameClickHandler");        
       // add the new subTree to the end of historySubTree
       this.history.addToHistory(id);
       this.refreshEntityContentElem(this);
    }
}

在另一个档案中:

addEventListenersToEntityInExplorer(elem, id) {
      elem.find('[data-id ^= "expand_"]').click(ClickHandlers.expandButtonHandler);
      elem.find('[data-id ^= "entity"]').click(function() {
         ClickHandlers.entityNameClickHandler.call(this, id)
      }.bind(this));

}

我收到错误的行:  this.history.addToHistory(ID);  this.refreshEntityContentElem(本);

错误是:

  

错误:(25,12)TS2339:属性'历史'在类型上不存在   ' typeof ClickHandlers'。

据我所知,Typescript看到了这个'作为类ClickHanlders。但是,我调用了函数' ClickHandlers.entityNameClickHandler'使用' call',所以'这个'不一定是包装对象。

2 个答案:

答案 0 :(得分:2)

由于您正在更改函数内的this,因此您需要告诉编译器 你可以这样做,因为Specifying the type of this for functions的打字稿版本2.0:

type MyType = {
    history: any;
    refreshEntityContentElem: (obj: any) => void;
}

export class ClickHandlers {
    static entityNameClickHandler(this: MyType, id) {
       console.log("EntityNameClickHandler");        
       // add the new subTree to the end of historySubTree
       this.history.addToHistory(id);
       this.refreshEntityContentElem(this);
    }
}

答案 1 :(得分:0)

如果你想使用Typescript,你必须忘记javascript。 即使代码正常工作,Typescript也会抛出错误。它有很多东西,现在你无法做到,但你会得到更清晰的代码,错误更少。

  

错误:(25,12)TS2339:属性'历史'在类型' typeof ClickHandlers'。

上不存在

此错误表示如果要使用此。[property],则应将此属性定义为类变量或任何父类。

正如我在这里看到的那样:this.refreshEntityContentElem(this);,我可以理解你应该阅读面向对象编程的教程。