打字稿扩展第三方类错误:ElementHandle 仅指一种类型,但在此处用作值

DJ-*_*ock 7 extension-methods interface typescript puppeteer

我正在尝试用一种方法扩展puppeteer的类 ElementHandle 。我已经检查了一些示例并编写了简单的代码,就像在这个答案中一样

但是 VSCode 向我显示了更改 ElementHandle 原型的行的错误:

'ElementHandle' 仅指一种类型,但在此处用作值。ts(2693)

我该如何解决?

我的代码:

import { ElementHandle } from 'puppeteer';

declare module 'puppeteer' {
    interface ElementHandle {
        scrollIntoView(): void;
    }
}

ElementHandle.prototype.scrollIntoView = async function (): Promise<void> {
    await this._scrollIntoViewIfNeeded();
}
Run Code Online (Sandbox Code Playgroud)

ElementHandle 类:https : //github.com/puppeteer/puppeteer/blob/master/src/JSHandle.js

tmi*_*lar 3

您看到的错误消息是准确的:对于 Puppeter,ElementHandle指的是类型,而不是类/对象/值。

在 Typescript 中,类型仅在编译时存在。然后,在运行时,它们根本不存在,它们被完全删除。

为此,特发表声明:

ElementHandle.prototype.scrollIntoView = async function() { /* */ }
Run Code Online (Sandbox Code Playgroud)

行不通。由于 ElementHandle 是唯一类型,因此它在运行时不会存在,因此您无法发送消息.prototype来尝试访问它。

这里的解释是,这ElementHandle只是puppeteer 处理的一些实体的抽象表示,而不是具有实体和/或可以用作模板的引用,如类。

因此,不可能像您想要的那样为其分配一个函数(或任何值)来“扩展”它。