我应该如何构建一个包含主线程(DOM)脚本和工作程序的项目?例如:
// This file must have DOM types, but not worker types.
const worker = new Worker('worker.js');
worker.onmessage = (event) => {
// Ideally, I should be able to reference types from the worker:
const data = event.data as import('./worker').HelloMessage;
console.log(data.hello);
};
Run Code Online (Sandbox Code Playgroud)
// This file must have worker types, but not DOM types.
// The global object must be one of the worker globals (how do I pick which?)
const helloMessage = {
hello: 'world',
};
export type …Run Code Online (Sandbox Code Playgroud) 我有一个我想用 TypeScript 编写的网络工作者。
问题是Worker.postMessage- TypeScript 假设每个脚本都将在窗口上下文中加载,因此 expect Window.postMessage,它具有不同的语法。
这意味着当我尝试使用postMessage.
有办法解决这个问题,例如通过重新定义函数 declare function postMessage(message: any),但其中大多数充其量只是丑陋的杂物 - TS 的重点是检查类型,声明我自己的虚拟对象会打败它。
出于同样的原因 - window(及其上下文中的所有内容)在此上下文中不可用,并且应被 TS 识别为错误。例如alert('message')应该导致 TS 警告,而不是运行时错误。
有什么办法可以让文件获取实际定义(来自webworker.es2016.d.ts)并以某种方式告诉 TypeScript 这段代码将在工作上下文中运行而不是在窗口中运行?
我收到以下错误
未捕获的TypeError:无法在'DedicatedWorkerGlobalScope'上执行'postMessage':提供的值无法转换为序列.
在网络工作者的这一行:
postMessage("hi", "http://localhost:8000");
Run Code Online (Sandbox Code Playgroud)
(事实上,这就是整个网络工作者).
基本文件包含:
var myWorker = new Worker("test.js");
myWorker.onmessage = function (e) {
console.log('Message received from worker');
};
Run Code Online (Sandbox Code Playgroud)
我不确定它抱怨哪个值,我不确定将它转换为"序列"意味着什么.