2016-08-13 46 views
0

我在寫一個允許用戶指定回調的庫。像這樣:讓打字稿知道對象是什麼類型

interface IParams { 
    context: any; 
    okCallback: (value: string) => void 
    ... etc ... 
} 

class MsgBox { 
    static getInput(params: IParams) { 
     .... 
     okCallback.call(params.context, value); 
    } 
} 

上下文的目的是將回調放在上下文中。因此,例如我可以這樣做:

MsgBox.getInput({ 
    context: this, 
    okCallback(value) { 
     this.accessToEnclosingClass 
    } 
} 

由於回調需要訪問調用類的屬性。這使得它比在所有地方使用$ .proxy()更方便。

這工作正常,但是,問題與打印機編譯器。在回調打字稿中不知道this的類型,所以對待它就像任何類型,並且不會爲我進行任何類型檢查,這會導致很多挫折。

有沒有辦法讓Typescript編譯器知道在這種情況下this的類型是什麼?我可以這樣做:

 okCallback(value) { 
     const self = this as EnclosingClassType; 
     self.accessToEnclosingClass 
    } 

哪些工作,但我寧願使用this(因爲否則是不小心使用this,從而可能導致非編譯型類型錯誤的機會

當然這一點。一個簡單的例子,當this環境未定義okCallback挑戰發生,但作爲一個單獨的函數。

在這個任何建議或想法?

+0

在TS 2.0中可以輸入'this'。請參閱https://github.com/Microsoft/TypeScript/pull/6739。 – 2016-08-13 06:56:07

回答

1

你可以只用一個arrow function節省的this背景:

MsgBox.getInput({ 
    context: this, 
    okCallback: (value) => { 
     this.accessToEnclosingClass 
    } 
} 

編譯器(和IDE)會明白,也因此不會把this爲已任。

+1

箭頭函數不僅僅是類型檢查:你不能再使用'okCallback.call(aDifferentThis)'在'okCallback'內改變'this'上下文。這意味着'getInput'可以做'okCallback(value)',並且你可以用'(value:string)=> void'代替'IParams',因爲'context'字段是不需要的。 –