【问题标题】:Typescript with jQuery UI Widgets - Implementing call signatures带有 jQ​​uery UI 小部件的 Typescript - 实现调用签名
【发布时间】:2012-12-27 18:33:39
【问题描述】:

我的网站上有很多对话框(登录对话框、注册对话框、联系人对话框等),我正在尝试使用 Typescript 进行建模。

jquery-ui d.ts 文件这样定义了一个 Dialog 接口:

interface Dialog extends Widget, DialogOptions, DialogEvents{  }

DialogOptionsDialogEvents 中的所有内容都是可选的,所以那里没有问题,但是 Widget 接口定义了一些我不理解的调用签名:

interface Widget {
    (methodName: string): JQuery;
    (options: WidgetOptions): JQuery;
    (options: AccordionOptions): JQuery;
    (optionLiteral: string, optionName: string): any;
    (optionLiteral: string, options: WidgetOptions): any;
    (optionLiteral: string, optionName: string, optionValue: any): JQuery;

    (name: string, prototype: any): JQuery;
    (name: string, base: Function, prototype: any): JQuery;
}

当我尝试在一个类中实现这个接口时:

class LoginDialog implements Dialog { 

}

编译器抱怨:

Class 'LoginDialog' declares interface 'Dialog' but does not implement it: Type 'Dialog' requires a call signature, but Type 'LoginDialog' lacks one.

我不明白如何实现这些“调用签名”或者他们应该做什么,其实我什至不明白调用签名是什么。

编辑:

我发现调用签名的一种有效用例是回调输入:

interface ICallback{
    (param: string) : void;
}

function someMethod(callback: ICallback){
    callback('a string'); //Good
    callback(5);         //Bad 
}

但是,问题仍然存在,因为我找不到多个调用签名的用例,并且仍然不明白如何实现 jquery-ui.d.ts 对话框接口

【问题讨论】:

    标签: javascript jquery-ui typescript


    【解决方案1】:

    如果您使用的是 jQuery UI,则不需要实现这些接口中的任何一个,因为它们已经在 jQuery UI 中实现了。这些接口只是为您提供类型信息,以使用静态类型调用现有的 jQuery UI 函数。

    $( "#dialog" ).dialog();
    

    例如,如果没有jquery-ui.d.ts,类型系统就不会知道dialog() 函数。

    【讨论】:

    • 嗯,是的,这就是我目前使用对话框的方式,没有问题。但我希望完成一种更加面向对象的方法来管理我网站上的许多对话,这些对话仅略有不同。我现在没有代码在我面前,但是当我有的时候我会更多地研究这个。
    • 在这种情况下,我会将整个 jQuery 实现隐藏在你自己的 IDialog 接口后面,这样你自己的接口就更简单了。
    • 好的,有道理,问题已回答。谢谢
    猜你喜欢
    • 1970-01-01
    • 2011-05-08
    • 2012-10-18
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 2014-08-05
    相关资源
    最近更新 更多