Hur man utökar JQuery-funktioner i TypeScript


Jag skriver om lite JS-kod till TypeScript och stöter på problem med modulimport. Till exempel vill jag skriva min toggleVisiblity-funktion. Här är koden:

/// <reference path="../../typings/jquery/jquery.d.ts" />

import * as $ from "jquery";

interface JQuery {
    toggleVisibility(): JQuery;
}

$.fn.extend({
    toggleVisibility: function () {
        return this.each(function () {
            const $this = $(this);
            const visibility = $this.css('visibility') === 'hidden' ? 'visible' : 'hidden';
            $this.css('visibility', visibility);
        });
    }
});

const jQuery = $('foo');
const value = jQuery.val();
jQuery.toggleVisibility();

Men problemet är att av okänd anledning läggs inte toggleVisibility till i JQuery-gränssnittet, så jag får ett fel Property 'toggleVisibility' does not exist on type 'JQuery'., även om det ser andra metoder (val, each och så vidare).

Varför fungerar det inte?

Svar #1

Försök att sätta

interface JQuery {
    toggleVisibility(): JQuery;
}

Inuti en separat fil utan import-/exportsatser. Det fungerar för mig. Fast det skulle vara intressant att veta varför.

REDIGERA: Det finns en utmärkt förklaring till detta beteende i detta svar på inlägget: Hur man utökar 'Window'-gränssnittet i TypeScript

Svar #2

Jag fick lösningen, detta fungerade för mig:

Använd JQueryStatic-gränssnittet för statisk jQuery-åtkomst som $.jGrowl(...) eller jQuery.jGrowl(...) eller i ditt fall, jQuery.toggleVisibility():

interface JQueryStatic {

    ajaxSettings: any;

    jGrowl(object?, f?): JQuery;

}

Och för dina egna specialgjorda funktioner använder du jQuery.fn.extend, använd jQuery-gränssnittet:

interface JQuery {

    fileinput(object?): void;//custom jquery plugin, had no typings

    enable(): JQuery;

    disable(): JQuery;

    check(): JQuery;

    select_custom(): JQuery;

}

Valfritt, här är mina utökade JQuery-funktioner:

jQuery.fn.extend({
    disable: function () {
        return this.each(function () {
            this.disabled = true;
        });
    },
    enable: function () {
        return this.each(function () {
            this.disabled = false;
        });
    },
    check: function (checked) {
        if (checked) {
            $(this).parent().addClass('checked');
        } else {
            $(this).parent().removeClass('checked');
        }
        return this.prop('checked', checked);
    },
    select_custom: function (value) {
        $(this).find('.dropdown-menu li').each(function () {
            if ($(this).attr('value') == value) {
                $(this).click();
                return;
            }
        });
    }
});

Relaterade artiklar