【问题标题】:Overload jQuery constructor to use own object重载 jQuery 构造函数以使用自己的对象
【发布时间】:2015-10-09 10:18:14
【问题描述】:

我对@9​​87654321@ 很陌生,不确定这是否可行。 我的应用程序使用jQuery。要创建一个新的JQuery,我可以使用:

var $someElement = $("#someString");

我定义了一个看起来像这样的对象:

class HtmlElementId {
    private idPrefix: string = "#";

    id: string;

    constructor(id: string) {
        this.id = id;

        if (id.indexOf(this.idPrefix) !== 0) {
            this.id = this.idPrefix + id;
        }
    }
}

我想以某种方式重载 JQuery 构造函数来制作这样的东西

$(idElement : HtmlElementId){
    return $(idElement.id);
}

所以我可以在代码中使用它

var myIdElement = new HtmlIdElement("someString");

var $someElement = $(myIdElement); // <- this is what I want

问题:这可能吗?如果可以,如何实现?

【问题讨论】:

  • 你只是想扩展类型定义(假设你正在使用像DefiniteTyped/tsd这样的东西)还是想知道如何编写代码来覆盖jQuery?
  • @billc.cn 我确实使用了definitelyTyped,不想更改*.d.ts 文件。是否可以在单个文件接口定义中进行扩展?

标签: jquery constructor typescript overloading


【解决方案1】:

不是 100% 肯定,但我认为这样的事情可能会奏效

var $ = (id: string) => {
    return new HtmlIdElement(id);
}

$("test")

虽然我确实有一种感觉,现在在使用 jQuery 时,您可能需要使用 jQuery("") 而不是 $(""),因为您已将 $ 替换为您自己的定义

【讨论】:

  • 我应该把它放在哪里才能让它在我的global 范围内的TypeScript 类中可用?
【解决方案2】:

您需要使用Declaration Merging 扩展JQueryStatic 接口。

在你的情况下,代码很简单:

interface JQueryStatic {
    (idElement: HtmlElementId): JQuery;
}

您可以将其添加到以这种方式使用 jQuery 的每个 .ts 文件或它的 owd d.ts 文件中。

在后一种情况下,您可以将所有对jquery.d.ts 的引用替换为您自己的文件,编译器将传递搜索d.ts 文件。

【讨论】:

  • 但是我将在哪里以及如何实现该方法?还是像是要在jQuery的原型上加点东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 2014-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多