2013-07-10 148 views
3

我已經安裝在我的VS 2012更新3調度自定義事件

我要派遣一個自定義事件,但在lib.d.ts不公開聲明的環境變量的打字稿編譯器0.9.0.1版本預期的構造函數簽名。

當我使用

var myEvent = new CustomEvent("my:event:type", { detail: { some: "data"} }); 
window.dispatchEvent(myEvent); 

腳本編譯器抱怨的類型,因爲據他說,只有

var myEvent = new CustomEvent(); 

是正確的。

後者根據Chrome瀏覽器27和Aurora 24.02,是錯誤的原因是「缺少參數」

MDN還列出了實際,正確的但不換打字稿構造函數簽名。

我現在的想法是將已知正確的構造函數簽名添加到環境變量聲明中,但未觸及已發佈的lib.d.ts文件。這在技術上可行嗎?我無法提出正確的語法,語言規範也沒有提到如何合併兩個這樣的聲明。

或者,我只需編輯lib.d.ts,在IDE重新啓動後爲我提供了更新的簽名。不過,我寧願不以這種方式篡改第三方文件。最後,還有其他一些機制我(sh | c)應該用來編寫調度自定義事件的類型腳本代碼嗎?

(更新:重新啓動IDE重裝lib.d.ts正確此外,修正虛構的事件類型名稱。)

回答

3

這不是lib.d.ts的一部分的原因是Internet Explorer在IE10中不支持此對象。

如果CustomEvent定義是純粹的界面,你將能夠從而延長它:

interface CustomEvent { 
    new(eventType: string, data: {}); 
} 

CustomEvent構造函數中的變量聲明,你不能延長實際上定義:

declare var CustomEvent: { 
    prototype: CustomEvent; 
    new(): CustomEvent; 
} 

當您等待Internet Explorer/TypeScript庫被更新時,您可以使用此(討厭尋找)解決方法來獲取自定義事件。

class StandardsCustomEvent { 
    static get(eventType: string, data: {}) { 
     var customEvent = <any>CustomEvent; 
     var event = new customEvent(eventType, data); 
     return <CustomEvent> event; 
    } 
} 

var x = StandardsCustomEvent.get("myevent", { detail: { some: "data"} }); 

此修復編譯器警告 - 但不會讓它在IE10以上的工作 - 你需要填充工具。

+0

定義一個TypeScript類型的構造函數不*返回該類型的對象確實是討厭的... – Arne

1

最後我做了這一切:

  • 使用 - 在構建
  • nolib選項添加lib.d.ts的本地副本
  • 補丁在預期的構造函數簽名
  • 添加填充工具爲IE < = 11所提議的MDN
0
var event = <CustomEvent>(new (<any>CustomEvent)('specifiedEvent')) 

可能是一個解決方案。好看又棘手。