2014-01-17 74 views
3

我剛剛開始使用Typescript,但我想知道是否可以用新方法擴展JQueryEventObject - 我想添加一個取消方法來設置事件停止冒泡和傳播。可能在TypeScript中擴展JQueryEventObject

如果我的理解是正確的,那麼使用TypeScript是無法做到這一點的,因爲JQueryEventObject僅僅是一個接口,它被創建爲提供事件對象提供給事件的可用內容的智能感知。但是,我可能是錯的,如果有人有解決方案,那麼我會很感激有人與我分享。

回答

1

打字稿定義是一個接口,但您可以擴展它,並且還可以擴展運行時以添加新功能。有跡象表明,需要做兩件事情:

  1. 化妝打字稿知道新功能的
  2. 使在運行時可用新的函數內的jQuery

下面是一個代碼示例,做兩件事:

// PatchJquery.ts 
// Include the generated .js file for this, after jQuery, in some html file. 

/// <reference path="typedef/jquery/jquery.d.ts" /> 

// Runtime patch: Assume jQuery is already defined in the global scope 
// and patch its Event prototype. 
jQuery.Event.prototype.cancel = function() { 
    console.log("Someone wants me to cancel this event!",this); 
} 

// Define the extended typescript interface 
interface ExtJQueryEventObject extends JQueryEventObject { 
    cancel():void; 
} 

// Test 
$(function() { 
    var body:JQuery = $("body"); 
    body.on('click', (e:ExtJQueryEventObject) => { 
     e.cancel(); 
    }); 
}); 

請注意,如果您想要實際的單擊事件,則需要爲JQueryMouseEventObject定義擴展接口。您需要爲所有不同的JQuery事件類型執行此操作。或者,您可以修改jquery.d.ts以將新函數添加到BaseJQueryEventObject。

(順便說一句,jQuery有stopPropagation()和stopImmediatePropagation(),這可能會做你想要什麼已經)

+0

你甚至都不需要以不同的方式命名接口,給它相同的名稱會自動擴大現有接口。 – thomaux

+1

謝謝你們,我實際上最終是這樣做了@Anzeo的建議,而不需要ExtJQueryEventObject,它工作正常。我想要一個cancel事件的原因是,我不需要繼續編寫preventDefault(),stopPropagation()和stopImmediatePropagation(),因爲取消後的代碼調用所有這些,並將cancelBubble設置爲true。 – Anupheaus