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

时间:2013-04-24 23:48:04

标签: knockout.js typescript definitelytyped

我通常通过

在JavaScript中添加自定义knockout binding handlers
ko.bindingHandlers.myBindingHandler = {...}

但现在我必须通过

TypeScript添加它们
ko.bindingHandlers["myBindingHandler"] = {...}

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

  

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

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

那么,如何在使用definitelyTyped's knockout definition时将我的自定义绑定处理程序添加到knockout,同时还可以通过intellisense等引用我的定义?

3 个答案:

答案 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

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

注意:subscribableobservableobservableArraycomputed类型有不同的界面:

  • 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 = {...}