HTMLElement 类型的值不可调用

Posted

技术标签:

【中文标题】HTMLElement 类型的值不可调用【英文标题】:Value of type HTMLElement is not callable 【发布时间】:2013-04-18 01:31:22 【问题描述】:

我在将其中一条 javascript 行转换为 TypeScript 时遇到了一点问题。

此行用于在 ID 为 containerId 的容器上创建类型为 widgetName 的小部件。 widgetName 是一个字符串:

$('#' + containerId)[widgetName](options)

示例: 在 id 为 example

的 div 上创建一个没有选项的手风琴小部件
$('#example')["accordion"]();
// which could be rewritten as:
$('#example').accordion();

虽然 JavaScript 有效,但 TypeScript 在第一行抛出错误:

谁能帮助我如何写这个声明?我不能将htmlElement 转换为JQueryStatic。提前致谢!

【问题讨论】:

如果widgetName 是一个整数,我可以看到这个错误; [widgetName] 将在 jQuery 集合中的该位置检索 HTMLElement,而 (options) 会抛出错误……但这不是有效的 JavaScript,更不用说 TypeScript。 @Matt widgetName 被键入为字符串,$(..)[string] 的结果是HTMLElement,这导致了问题:) ...那么这怎么可能?你不能执行HTMLElement,如果你想创建一个,你必须使用document.createElement...? 问题是 TypeScript 假设它是一个HTMLElement。事实上,我打电话给$().accordion(options)。更新了我的问题以明确这一点。 【参考方案1】:

最简单的解决方案:

(<any>$('#example'))["accordion"]();

【讨论】:

谢谢,但我已经在使用 jQuery UI 的定义文件,我需要保留当前的语法,因为它提供了灵活性。 @Anzeo 我以为你在另一行得到错误 :) 我倾向于写“上面的行给出一个错误”或“下面的行给出一个错误”以帮助更快地理解。 啊,是的,我编辑了我的问题,这就是为什么不清楚。我已经更新了它以供将来参考:)【参考方案2】:

您是否使用最新版本的确定类型 (https://github.com/borisyankov/DefinitelyTyped/blob/master/jquery/jquery.d.ts) 的 jquery 定义文件?

看起来这在你的情况下应该可以正常工作(第 726/727 行)-

[x: string]: any;
[x: number]: HTMLElement;

旧版本的 d.ts 定义不正确:

[x: string]: HTMLElement; // *WRONG*
[x: number]: HTMLElement;

(更新:经过测试,我发现我有同样的错误。更新到上面列出的 d.ts 可以修复它)。

【讨论】:

谢谢,我正在考虑升级它,但我们目前仍在使用 jQuery 1.7.1,我担心会有重大变化?我马上试试这个! 我不知道。不过,您可以自己轻松解决问题。不确定 d.ts 中的行号是什么,但只需在 JQuery 界面上搜索 [x: string]: HTMLElement; 并将其修改为 [x: string]: any; - 我认为这不会破坏其他任何内容。

以上是关于HTMLElement 类型的值不可调用的主要内容,如果未能解决你的问题,请参考以下文章

Javascript Puppeteer 错误:节点不可点击或不是 HTMLElement

TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”

TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”

TypeScript——不能将类型“HTMLElement | null”分配给类型“HTMLElement”

“HTMLElement”类型的参数不能分配给“CanvasImageSource”类型的参数

Typescript零碎总结