如何在打字稿中定义敲除绑定处理程序?

我通常在JavaScript中添加自定义挖空 绑定处理程序

ko.bindingHandlers.myBindingHandler = {...} 

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

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

否则我得到这个错误,因为我正在使用typescript.d.ts

属性'myBindingHandler'不存在于types'KnockoutBindingHandlers'的值上

我不喜欢["property"]方法,因为那样我就不能再引用它,或者在以后得到智能感知。

那么,我怎样才能添加我的自定义绑定处理程序淘汰赛,同时使用absolutelyTyped的淘汰赛定义 ,同时也能够通过intellisense引用我的定义等?

定义一个自定义绑定处理程序

其实很简单,只需在定义自定义绑定处理程序之前将其添加到KnockoutBindingHandlers接口即可( myBindingHandler )。 请注意,您必须在版本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 ,你会在打字稿中做到这一点

 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); 

注意: subscribableobservableobservableArraycomputedtypes有不同的接口:

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

在knockoutjs上添加到fn的文件就在这里

你可以简单地忽略它 ,但是这不是一个好的做法 ,通过转换为any你没有定义属性的typesmyBindingHandler

 (<any>ko.bindingHandlers).myBindingHandler = { ... }; 

另一个肮脏的方式来忽略任何types的检查:

 let bindingHandlers: any = ko.bindingHandlers; bindingHandlers.myHandler = {...}