使用Typescript时,如何停止“ JQuery类型上不存在属性”语法错误?


80

我在应用程序中仅使用一行jQuery:

$("div.printArea").printArea();

但这给我一个Typescript错误:

JQuery类型不存在属性'printArea'吗?

有人可以告诉我如何停止出现此错误吗?

Answers:


187

您可以将其<any>强制转换或扩展jquery类型以添加​​自己的方法。

 (<any>$("div.printArea")).printArea();

//或添加您自己的自定义方法(假设此方法是您自己添加为自定义插件的一部分)

interface JQuery {
    printArea():void;
}

给我:Error:(44, 23) TS2339: Property 'printArea' does not exist on type 'ElementFinder'.
user47376 '16

如果您尝试interface JQuery使用外部模块的方式,并将函数参数定义为JQuery类型,然后尝试从另一个文件中调用它,那么TypeScript会抱怨说有两种类型的名为JQuery的类型无关。
山姆·鲁比

声明接口似乎很棒。而且比在任何地方投射<any>更干净
解码

43

我认为这是最易读的解决方案:

($("div.printArea") as any).printArea();

11

您可以将其投射到

(<any>$('.selector') ).function();

例如:日期选择器使用jquery初始化

(<any>$('.datepicker') ).datepicker();

3

对于您的示例,您将添加以下内容:

interface JQuery{
    printArea():void;
}

编辑:糟糕,下面的basarat是正确的。我不确定为什么我认为它正在编译,但是我已经更新了此答案。


不。他用$包装一个对象。它不再是静态的$
basarat

嗯,你确定吗?我在一个项目中对其进行了测试,并且成功了。
AlexB

对。您的案件$.inviewport(el)行动案$('selector').printArea
basarat

抱歉,并不是要之以鼻,但是我的代码对我有用。问题似乎与如何编译代码有关,所以如果我的代码可以编译,那么这有什么问题呢?注意,我的第二个使用printArea()的示例也可以工作。
AlexB

$('selector').printArea编译?我不这么认为。$.printArea虽然会编译。您一直非常有礼貌,因此没有采取或故意进行的攻击:)
basarat 2014年

2

由于printArea是jQuery插件,因此jquery.d.ts中不包含它。

您需要创建一个jquery.printArea.ts定义文件。

如果为插件创建完整的定义文件,则可能需要将其提交给DefinitelyTyped


并确保您的tsconfig.json也正确安装。如果具有“类型”设置,则仅列出的类型将被识别。如果不是,那么它将识别出node_modules / @ types中的所有内容
Dan

2

您还可以使用ignore语法,而不是使用(或更好的“ as any”)表示法:

// @ts-ignore
$("div.printArea").printArea();

1

您也可以这样写:

let elem: any;
elem = $("div.printArea");
elem.printArea();
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.