如何在 TypeScript 中扩展 JQuery 函数
How to extend JQuery functions in TypeScript
我正在用 TypeScript 重写一些 JS 代码,遇到模块导入问题。例如,我想编写 toggleVisiblity
函数。这是代码:
/// <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();
但问题是由于未知原因 toggleVisibility
未添加到 JQuery
界面因此我收到错误 Property 'toggleVisibility' does not exist on type 'JQuery'.
,尽管它看到其他方法(val
, each
等等)。
为什么它不起作用?
尝试将
interface JQuery {
toggleVisibility(): JQuery;
}
在没有 import/export 语句的单独文件中。
这对我有用。虽然知道为什么会很有趣。
编辑:在 post 的回答中对此行为有很好的解释:
How to extend the 'Window' typescript interface
我得到了解决方案,这对我有用:
使用 JQuery静态接口进行静态 jQuery 访问,例如 $.jGrowl(...) 或 jQuery.jGrowl(...) 或者在您的情况下,jQuery.toggleVisibility():
interface JQueryStatic {
ajaxSettings: any;
jGrowl(object?, f?): JQuery;
}
对于您使用 jQuery.fn.extend 使用的自定义函数,请使用 JQuery 界面:
interface JQuery {
fileinput(object?): void;//custom jquery plugin, had no typings
enable(): JQuery;
disable(): JQuery;
check(): JQuery;
select_custom(): JQuery;
}
可选,这是我扩展的 JQuery 功能:
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;
}
});
}
});
我正在用 TypeScript 重写一些 JS 代码,遇到模块导入问题。例如,我想编写 toggleVisiblity
函数。这是代码:
/// <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();
但问题是由于未知原因 toggleVisibility
未添加到 JQuery
界面因此我收到错误 Property 'toggleVisibility' does not exist on type 'JQuery'.
,尽管它看到其他方法(val
, each
等等)。
为什么它不起作用?
尝试将
interface JQuery {
toggleVisibility(): JQuery;
}
在没有 import/export 语句的单独文件中。 这对我有用。虽然知道为什么会很有趣。
编辑:在 post 的回答中对此行为有很好的解释: How to extend the 'Window' typescript interface
我得到了解决方案,这对我有用:
使用 JQuery静态接口进行静态 jQuery 访问,例如 $.jGrowl(...) 或 jQuery.jGrowl(...) 或者在您的情况下,jQuery.toggleVisibility():
interface JQueryStatic {
ajaxSettings: any;
jGrowl(object?, f?): JQuery;
}
对于您使用 jQuery.fn.extend 使用的自定义函数,请使用 JQuery 界面:
interface JQuery {
fileinput(object?): void;//custom jquery plugin, had no typings
enable(): JQuery;
disable(): JQuery;
check(): JQuery;
select_custom(): JQuery;
}
可选,这是我扩展的 JQuery 功能:
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;
}
});
}
});