网站搜索

Web Worker - 在 TypeScript 项目中运行内联 Web Worker 代码


我正在使用 TypeScript 开发浏览器代码。我希望把我的部分代码在 Web Worker 中运行。

除了编写单独的脚本文件之外,我想实现的是有一个类来封装 Webworker,并提供一个方法 run(method: Function, ...args: any[])。通过这个方法,我就可以传入一个函数以及参数值,以便在 worker 中调用这个函数。我可以使用 Blob 对象来实现,如此处所解释的 https://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers

然而,我遇到的问题是,我传递给 run 的函数其主体中可能包含对 postMessage 的调用,而这是 web worker 全局作用域的 postMessage,而不是 DOM 全局作用域的 postMessage。因此,Typescript 会报错,因为两者的声明不兼容。

有人有建议这可能如何工作吗?

选项 1

在函数体内将 postMessage 强制转换为

`(postMessage as any)('Hi from web worker')

但是那很丑。

选项2

将此 lib.dom.d.ts 签名转换

declare function postMessage(message: any, targetOrigin: string, transfer?: any[]): void;

进入

declare function postMessage(message: any, targetOrigin?: string, transfer?: any[]): void;

(请看添加的问号)

但是有更好的东西吗?

答案#1

我遇到了同样的问题。以下是我的选择:

选项3

// @ts-ignore
postMessage(result);

选项 4

const postMessageOnWorker = postMessage as (message: any) => void;
postMessageOnWorker(result);

当我把第二个参数写成 postMessage(result, "*") 时,它导致了运行时错误(至少在 Chrome 上是这样)。所以,第二个参数不是可选的,它不应该存在。