trabajador web - Ejecutando código de trabajador web en línea desde dentro de un proyecto de TypeScript
Estoy desarrollando código para el navegador usando Typescript. Parte de mi código quiero ejecutarlo en un trabajador web.
Aparte de escribir archivos de script separados, lo que me gustaría lograr es tener una clase que envuelva el Webworker y proporcione un método run(method: Function, ...args: any[]). A este método podría pasarle una función junto con los valores de los argumentos para llamar a la función dentro del worker. Puedo hacer que esto funcione usando el objeto Blob como se explica aquí https://www.html5rocks.com/en/tutorials/workers/basics/#toc-inlineworkers
El problema con el que me encuentro, sin embargo, es que la función que paso a run podría tener llamadas a postMessage en su cuerpo, que es el postMessage del ámbito global del trabajador web, no del ámbito global del DOM. Por lo tanto, Typescript se queja, porque ambos tienen una declaración incompatible.
¿Alguien tiene una sugerencia de cómo podría funcionar esto?
Opción 1
Convierte postMessage dentro del cuerpo de la función como
`(postMessage as any)('Hi from web worker')
pero eso es feo.
Opción 2
sería convertir esta firma lib.dom.d.ts
declare function postMessage(message: any, targetOrigin: string, transfer?: any[]): void;
en
declare function postMessage(message: any, targetOrigin?: string, transfer?: any[]): void;
(vea el signo de interrogación agregado)
¿Pero hay algo mejor?
Respuesta #1
Me encontré con el mismo problema. Aquí están mis opciones:
Opción 3
// @ts-ignore
postMessage(result);
Opción 4
const postMessageOnWorker = postMessage as (message: any) => void;
postMessageOnWorker(result);
Cuando pongo el segundo argumento como postMessage(result, "*"), causaba un error en tiempo de ejecución (al menos en Chrome). Por lo tanto, el segundo argumento no es opcional, no debería estar ahí.
