从typescript项目中运行内联webworker代码

时间:2018-02-04 19:47:32

标签: typescript web-worker

我正在使用Typescript开发浏览器代码。我想在web worker中运行一些代码。

除了编写单独的脚本文件之外,我想要实现的是拥有一个包装Webworker并提供方法run(method: Function, ...args: any[])的类。然后我可以将这个方法与参数值一起传递给worker调用函数。我可以使用此https://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers

中所述的Blob对象来完成此工作

我遇到的问题是,我传递给run的函数可以在其正文中调用postMessage,这是web worker全局作用域的postMessage,不是DOM全局​​范围。因此,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 个答案:

答案 0 :(得分:2)

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

选项3

// @ts-ignore
postMessage(result);

选项4

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

当我输入第二个参数,例如postMessage(result, "*")时,它会导致运行时错误(至少在Chrome上如此)。因此,第二个参数不是可选的,不应存在。