Hur löser jag 'Property 'width' does not exist on type 'HTMLElement'.' när jag typkontrollerar Javascript (INTE Typescript) med/@ts-check i vscode?


I view.js-filen:

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

i filen main.js:

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

ger mig 'Property 'width' finns inte på typen 'HTMLElement'. typkontrollfel.

Jag vet inte hur jag ska gå vidare, jag har noll kunskap om TypeScript, och programmet är ändå skrivet i JavaScript. Alla lösningar jag har läst kräver att man använder TypeScript, vilket är helt värdelöst i det här exemplet.

Finns det något jag kan göra för att bli av med det här felet?

REDIGERA om jag lägger till följande:

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

i min view.js-fil fixar det alla fel i min main.js... MEN, när jag lägger till // @ts-check på view.js-filen som innehåller raden ovan får jag:

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

REDIGERA 2

Det verkar som att jag löste det genom att lägga till några parenteser med följande rad:

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

Svar #1

Inte alla HTML-element har en bredd, även om canvas gör det. Du kan lösa problemet genom att begränsa typen från HTMLElement till HTMLCanvasElement (kodexemplet är hämtat från denna TypeScript-artikel).

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

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

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

Eller så kan du fuska med en typannotering:

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

I JavaScript kan du använda JSDoc-kommentarer för att utföra typkontroller:

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

Och, även om jag inte har provat det, kanske du kan komma undan med en ts-ignore-kommentar även om det är en JavaScript-fil:

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

Relaterade artiklar