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

Posted

技术标签:

【中文标题】如何在打字稿中定义敲除绑定处理程序?【英文标题】:How do I define a knockout binding handler in typescript? 【发布时间】:2013-04-18 17:18:52 【问题描述】:

我通常通过在 javascript 中添加自定义 knockout binding handlers

ko.bindingHandlers.myBindingHandler = ...

但现在我必须通过

将它们添加到 TypeScript
ko.bindingHandlers["myBindingHandler"] = ...

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

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

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

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

【问题讨论】:

【参考方案1】:

定义自定义绑定处理程序

实际上非常简单,只需在定义自定义绑定处理程序之前将其 (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

【讨论】:

将接口添加到与新处理程序相同的文件对我不起作用(TS 0.9.5,VS2013),但将其添加到单独的 *.d.ts 文件中:@987654323 @ 你可以使用 myBindingHandler: KnockoutBindingHandler;而不是 myBindingHandler: ; 更新此答案以获取来自此类似问题的信息:***.com/questions/15862086/…【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

以上是关于如何在打字稿中定义敲除绑定处理程序?的主要内容,如果未能解决你的问题,请参考以下文章

如何在打字稿中为 const 定义重载签名?

如何在打字稿中定义一个常量数组

如何在打字稿中正确导入自定义类型

在打字稿中调试多个文件

我如何在打字稿中定义这个对象?

如何在较新版本的打字稿中处理打字稿错误 Object.ts (7053)?