首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JavaScript类型注解

JavaScript类型注解
EN

Stack Overflow用户
提问于 2014-12-12 22:41:01
回答 2查看 10.5K关注 0票数 5

我正在使用WebStorm并遇到以下问题:

代码语言:javascript
复制
/** @type {HTMLCanvasElement} */
var buffered_canvas = document.createElement("canvas");
buffered_canvas.width = 256;
buffered_canvas.height = 256;

当我将buffered_canvas注释为HTMLCanvasElement类型时,它会抱怨createElement返回不能分配给HTMLCanvasElement的HTMLElement。

代码语言:javascript
复制
/** @type {HTMLElement} */
var buffered_canvas = document.createElement("canvas");
buffered_canvas.width = 256;
buffered_canvas.height = 256;

当我将其更改为HTMLElement类型时,它会抱怨HTMLElement上没有定义宽度和高度属性。

我该如何正确地做这件事?

而且--我是JavaScript新手,很难找到任何真实的规范,比如HTMLElement,它有哪些属性或createCanvas的方法签名,以及它返回的类型。有时,我在MDN上找到了一些不错的东西,但它们通常不包括方法签名或许多类型信息。这些东西有什么好的资源吗?

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-13 03:47:18

您可以像这样键入类型:

代码语言:javascript
复制
var buffered_canvas = /** @type {HTMLCanvasElement} */ (document.createElement("canvas"));

本页底部

您可以将其与常规类型注释一起使用,如下所示。

代码语言:javascript
复制
/** @type {HTMLCanvasElement} */
var buffered_canvas = /** @type {HTMLCanvasElement} */ (document.createElement("canvas"));

如果WebStorm遵循与闭包相同的注释约定,这应该可以工作。

很难找到任何真实的规范,比如HTMLElement,它有哪些属性或createCanvas的方法签名,以及它返回的类型。

MDN是好的,您还可以查看WHATWGW3C的标准。

票数 6
EN

Stack Overflow用户

发布于 2014-12-13 03:51:34

这两种情况的最佳结果是,将类型设置为任一或使用管道操作符|

代码语言:javascript
复制
/** @type {HTMLCanvasElement|HTMLElement} */

现在,IDE将识别这两个继承的方法。

可以这样做,因为HTMLCanvasElement实际上扩展了一个HTMLElement。当您这样做时,您正在告诉IDE 2:

  1. 首先,您有一个HTMLCanvasElement,因为我们知道在createElement('canvas')上返回的HTMLElement是从new HTMLCanvasElement()传递给HTMLElement的。这就满足了你的第二个问题:

当我将其更改为HTMLElement类型时,它会抱怨HTMLElement上没有定义宽度和高度属性。

  1. 其次,您有一个HTMLElement,因为继承了HTMLCanvasElement.prototype = new HTMLElement(),所以这将满足您的第一个问题:

当我将buffered_canvas注释为HTMLCanvasElement类型时,它会抱怨createElement返回不能分配给HTMLCanvasElement的HTMLElement。

编辑

为了精确起见,下面是PHPStorm (我也假设WebStorm )用于document.createElement的内容

代码语言:javascript
复制
/**
@param {string} tagName
@return {Element}
*/
Document.prototype.createElement = function(tagName) {};

这是矛盾之处,当您悬停在方法上时,createElement在弹出窗口中得到的是

代码语言:javascript
复制
[ HTMLElement ] Document.prototype.createElement( [ string ] tagName )

最后,与之前的HTMLElement相同的原则是扩展Element,所以您可以使用这个注释

代码语言:javascript
复制
/** @type {Element|HTMLElement|HTMLCanvasElement} */
var buffered_canvas = document.createElement("canvas");
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27453232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档