Как определить обработчик привязки нокаута в машинописном тексте?

Обычно я добавляю собственный knockout обработчики привязки в JavaScript через

ko.bindingHandlers.myBindingHandler = {...}

но теперь мне нужно добавить их в TypeScript через

ko.bindingHandlers["myBindingHandler"] = {...}

в противном случае я получаю эту ошибку, потому что использую машинопись. д.ц:

Свойство myBindingHandler не существует для значения типа KnockoutBindingHandlers.

Мне не нравится подход ["property"], потому что тогда я не могу сослаться на него или получить информацию о нем позже.

Итак, как я могу добавить собственный обработчик привязки к нокауту, используя определение нокаута definitelyTyped, а также иметь возможность ссылаться на мое определение через intellisense и т. д.?


person Allen Rice    schedule 24.04.2013    source источник


Ответы (3)


Определение пользовательского обработчика привязки

На самом деле это довольно просто, просто добавьте его (myBindingHandler) в интерфейс KnockoutBindingHandlers прямо перед тем, как определить собственный обработчик привязки. Обратите внимание, что вам необходимо внести это дополнение в интерфейс в файле .d.ts версии 1.0 (или, возможно, более ранней).

bindingHandlers.d.ts

/// <reference path="typings/knockout/knockout.d.ts" />

interface KnockoutBindingHandlers {
    myBindingHandler: KnockoutBindingHandler;
}

myBindingHandler.ts

/// <reference path="bindingHandler.d.ts" />

ko.bindingHandlers.myBindingHandler = {...}

Теперь все работает. Это не перезапишет какие-либо существующие определения или объявления, поэтому ваше определение будет стоять рядом с ko.bindingHandlers.text и т. д.

Просто будьте осторожны, потому что, если вы не включите реальное определение myBindingHandler и сошлетесь на него в другом месте, оно скомпилируется из-за определения, которое вы добавили в KnockoutBindingHandlers, но сломается во время выполнения, потому что нет реализации myBindingHandler.

Документация по добавлению пользовательских обработчиков привязки в Knockoutjs находится здесь.

Использование fn для добавления пользовательских функций с помощью TypeScript

Точно так же, чтобы добавить что-то к ko.observable.fn, вы должны сделать это в машинописном тексте.

interface KnockoutObservableFunctions  { 
    myFnExtension(args: any): returnType; 
}

и назовите его с

// x will be defined as a returnType automatically, but you could specify it if you like, either way
var x: returnType = ko.observable("value").myFnExtension(args);

Примечание. Существуют разные интерфейсы для типов subscribable, observable, observableArray и computed:

  • ko.subscribable.fn ... добавить к KnockoutSubscribableFunctions
  • ko.observable.fn ... добавить к KnockoutObservableFunctions
  • ko.observableArray.fn ... добавить к KnockoutObservableArrayFunctions
  • ko.computed.fn ... добавить к KnockoutComputedFunctions

Документация по добавлению fn в Knockoutjs находится здесь

person Allen Rice    schedule 24.04.2013
comment
Добавление интерфейса в тот же файл, что и новый обработчик, у меня не сработало (TS 0.9.5, VS2013), но сработало добавление его в отдельный файл *.d.ts: http://stackoverflow.com/a/15876149/2381779 - person Zac Morris; 29.01.2014
comment
Вы можете использовать myBindingHandler: KnockoutBindingHandler; в отличие от myBindingHandler: {}; - person Chad Edrupt; 13.02.2014
comment
Обновление этого ответа, чтобы в нем была информация из этого аналогичного вопроса: stackoverflow.com/questions/15862086/ - person Allen Rice; 05.06.2014

вы можете просто проигнорировать его, но это не рекомендуется, приведением к any вы не определяете тип свойства myBindingHandler

(<any>ko.bindingHandlers).myBindingHandler = { ... };
person HB MAAM    schedule 29.05.2014

Еще один грязный способ игнорировать любую проверку типов:

let bindingHandlers: any = ko.bindingHandlers;
bindingHandlers.myHandler = {...}
person MarkosyanArtur    schedule 06.11.2015