Pesquisa de site

javascript - A propriedade 'innerText' não existe no tipo 'Element'


Estou usando Typescript com Puppeteer. Estou tentando obter o innerText de um elemento.

const data = await page.$eval(selector, node => node.innerText);

Estou recebendo o erro:

A propriedade 'innerText' não existe no tipo 'Element'

Eu tentei fazer o cast para HTMLElement como descrito nesta pergunta: erro "Propriedade 'innerText' não existe no tipo 'EventTarget'?"

const data = await page.$eval(selector, <HTMLElement>(node: HTMLElement) => node.innerText);

Bem como criar minha própria Interface assim:

interface TextElement extends Element {
    innerText: string;
}

Mas em cada caso estou recebendo o erro de que innerText não existe nesse tipo específico.

A propriedade 'innerText' não existe no tipo 'HTMLElement'

Por que isso está acontecendo e como lidar com isso?

Resposta #1

Você pode consertar assim:

const data = await page.$eval(selector, node => (node as HTMLElement).innerText);

ou :

const data = await page.$eval(selector, node => (<HTMLElement>node).innerText);

ATUALIZAÇÃO:

Então, após algumas trocas no Github, fica claro por que a sintaxe dessa pergunta não funciona. Na verdade, ela define uma função genérica anônima.

<HTMLElement>(node: HTMLElement) => node.innerText

Um exemplo mais claro seria o seguinte:

function myFunction<T>(node: T) {
    node.innerText; // Property 'innerText' does not exist on 'T'
}

const data = await page.$eval(selector, myFunction);

A nomeação infeliz de T como HTMLElement cria confusão.

Resposta #2

Para aqueles que precisam corrigir este erro para qualquer elemento retornado de querySelector:

const el = document.querySelector<HTMLElement>('#app');

if (el) {
  el.innerText = content;
}

Artigos relacionados