41

我通常通过在 JavaScript 中添加自定义敲除 绑定处理程序

ko.bindingHandlers.myBindingHandler = {...}

但现在我必须通过在TypeScript中添加它们

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

否则我会收到此错误,因为我正在使用typescript.d.ts

“KnockoutBindingHandlers”类型的值上不存在属性“myBindingHandler”

我不喜欢这种["property"]方法,因为以后我无法引用它或获得智能感知。

那么,如何在使用肯定类型的淘汰赛定义的同时将我的自定义绑定处理程序添加到淘汰赛,同时还能够通过智能感知等引用我的定义?

4

3 回答 3

54

定义自定义绑定处理程序

它实际上非常简单,只需在定义自定义绑定处理程序之前myBindingHandler将它 ( ) 添加到KnockoutBindingHandlers接口。 请注意,您必须在1.0 版(或更早版本)的文件中对界面进行此添加。.d.ts

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内容,您可以在 typescript 中执行此操作

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注意: 、observableobservableArraycomputed类型有不同的接口:

  • ko.subscribable.fn... 添加KnockoutSubscribableFunctions
  • ko.observable.fn... 添加KnockoutObservableFunctions
  • ko.observableArray.fn... 添加KnockoutObservableArrayFunctions
  • ko.computed.fn... 添加KnockoutComputedFunctions

在 knockoutjs 中添加到 fn 的文档在这里

于 2013-04-24T23:48:30.963 回答
4

您可以简单地忽略它,但这不是一个好习惯,通过强制转换为any您并没有定义属性的类型myBindingHandler

(<any>ko.bindingHandlers).myBindingHandler = { ... };
于 2014-05-29T17:23:09.273 回答
1

另一种忽略任何类型检查的肮脏方式:

let bindingHandlers: any = ko.bindingHandlers;
bindingHandlers.myHandler = {...}
于 2015-11-06T11:00:19.430 回答