Вы правы, что определение типов символов является интерфейсом, однако вы можете его расширить, и вы также можете расширить среду выполнения, чтобы добавить новую функцию. Есть две вещи, которые должны быть сделаны:
- делают машинопись известно о новой функции
- сделать новая функция доступна во время выполнения внутри 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.
(BTW, JQuery имеет stopPropagation() и stopImmediatePropagation(), которые могли бы сделать то, что вы хотите уже)
Вам не нужно даже назвать интерфейс по-разному, придавая ему такое же имя будет автоматически продлить существующий интерфейс. – thomaux
Благодарю вас обоих, я на самом деле закончил это, как предложил @Anzeo, без необходимости в ExtJQueryEventObject, и он отлично работает. Причина, по которой я хочу событие отмены, так это то, что мне не нужно продолжать писать preventDefault(), stopPropagation() и stopImmediatePropagation(), поскольку код, отменяющий отмену, вызывает все эти и устанавливает cancelBubble в true. – Anupheaus