如何解决’属性’宽度’在类型’HTMLElement’上不存在.’当使用// @ ts-check在vscode中键入检查Javascript(NOT Typescript)时?

在view.js文件中:

const canvas = document.getElementById('canvas');
...
export {
  canvas,};

在main.js文件中:

import * as view from '../src/view.js';
 ...
 xPosition: view.canvas.width / 2,

给我’属性’宽度’在类型’HTMLElement’上不存在.类型检查错误.

我不知道如何继续,我对打字稿没有任何了解,而且程序是用javascript编写的.我读过的所有解决方案都需要使用打字稿,这在本例中没用.

我有什么办法可以摆脱这个错误吗?

编辑如果我添加以下内容:

/** @type {HTMLCanvasElement} */
const canvas = document.getElementById('canvas');

在我的view.js文件中它修复了我的main.js中的所有错误…但是,当我在包含上面一行的view.js文件中添加// @ ts-check时,我得到:

Type 'HTMLElement' is not assignable to type 'HTMLCanvasElement'.
  Property 'height' is missing in type 'HTMLElement'.

编辑2

我似乎通过使用以下行添加一些括号来解决这个问题:

const canvas = /** @type {HTMLCanvasElement} */ (document.getElementById('canvas'));

解决方法

并非所有HTML元素都有宽度,尽管画布有.您可以通过将类型从HTMLElement缩小到HTMLCanvasElement来解决问题(代码示例取自 this TypeScript article).

const canvas = document.getElementById('x');

if (isCanvas(canvas)) {
    const width = canvas.width;
}

function isCanvas(obj: HTMLCanvasElement | HTMLElement): obj is HTMLCanvasElement {
    return obj.tagName === 'CANVAS';
}

或者您可以使用类型注释作弊:

const canvas = <HTMLCanvasElement>document.getElementById('x');
const width = canvas.width;

在JavaScript中,您可以使用JSDoc注释来执行类型断言:

/**
 * @type {HTMLCanvasElement}
 */
const canvas = document.getElementById('x');

而且,虽然我没有尝试过,但即使它是一个JavaScript文件,你也可能会使用ts-ignore注释:

// @ts-ignore: I don't care that it might not be a HTML Canvas Element
const width = canvas.width;

相关文章

我最大的一个关于TypeScript的问题是,它将原型的所有方法(无...
我对React很新,我正在尝试理解子组件之间相互通信的简洁方法...
我有一个非常简单的表单,我将用户电子邮件存储在组件的状态,...
我发现接口非常有用,但由于内存问题我需要开始优化我的应用程...
我得到了一个json响应并将其存储在mongodb中,但是我不需要的...
我试图使用loadsh从以下数组中获取唯一类别,[{"listing...