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 上是这样)。所以,第二个参数不是可选的,它不应该存在。
