我通常通过
在JavaScript中添加自定义knockout binding handlersko.bindingHandlers.myBindingHandler = {...}
但现在我必须通过
在TypeScript添加它们ko.bindingHandlers["myBindingHandler"] = {...}
否则我收到此错误,因为我正在使用typescript.d.ts:
属性'myBindingHandler'在'KnockoutBindingHandlers'类型的值上不存在
我不喜欢["property"]
方法,因为我以后无法引用它或获取智能感知。
那么,如何在使用definitelyTyped's knockout definition时将我的自定义绑定处理程序添加到knockout,同时还可以通过intellisense等引用我的定义?
答案 0 :(得分: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中添加自定义绑定处理程序的文档是 here
同样,要向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
,observable
,observableArray
和computed
类型有不同的界面:
ko.subscribable.fn
...添加到KnockoutSubscribableFunctions
ko.observable.fn
...添加到KnockoutObservableFunctions
ko.observableArray.fn
...添加到KnockoutObservableArrayFunctions
ko.computed.fn
...添加到KnockoutComputedFunctions
在knockoutjs中添加到fn的文档是 here
答案 1 :(得分:4)
你可以简单地忽略它,但这是不是一个好习惯,通过强制转换为any
你没有定义属性的类型{{ 1}}
myBindingHandler
答案 2 :(得分:1)
忽略任何类型检查的另一种肮脏方式:
let bindingHandlers: any = ko.bindingHandlers;
bindingHandlers.myHandler = {...}