错误 TS2554:预期2-3个参数,但只得到了1个。

3

根据给定的tsconfig.json文件,

{

    "compilerOptions": {

      "lib": ["es2015", "dom"]
    },
    "files": [
      "./project1/tstut.ts",
      "./project1/worker.ts"

    ]
  }

并且 文件夹结构


1)

对于下面的代码(./project1/tstut.ts),

if(window.Worker){
  console.log('Workers are available');
}
....
let worker: Worker = new Worker('worker.js');
worker.postMessage('do some work')

如何解决以下 TypeScript 错误?

Property 'Worker' does not exist on type 'Window'

以下是工人代码(./project1/worker.ts):

self.addEventListener('message', (e) => {
    // console.log(e)
    if(e.data === 'do some work'){
        console.log('Worker is about to start some work');
        let count: number =0;
        for(let i: number=0; i<1000; i++){
            count += i;
        }
        self.postMessage({message:count});
    }

})

JS允许使用语法self.postMessage({message: count})
详见https://github.com/Microsoft/TypeScript/issues/582
根据方案,不能解决我的问题。
如何解决postMessage()的以下错误?在运行tsc时出现:Expecting 2-3 arguments, but got 1

例如,window.alert 不期望语法 alert in window。为什么 Worker 需要使用 Worker in window 语法呢? - overexchange
@artem Worker in windowwindow.Worker 有什么不同?这两种语法都表示 window 对象中的一个属性,不是吗? - overexchange
在JavaScript中是一样的。对于TypeScript,它取决于在typings中声明类型的方式。由于某种原因,在DOM typings中,alert被定义为window对象上的属性,而Worker则没有。 - artem
@artem 使用这个语法,interface Worker extends EventTarget,AbstractWorker {},那么window中的Worker语法如何表明Workerwindow的属性? - overexchange
1
是的,这是JavaScript语法,它不会在编译时进行检查,只会在运行时进行检查。 - artem
显示剩余4条评论
1个回答

14

工作人员不居住在 window 对象上。

if (typeof(Worker) !== "undefined") {
    // Yes! Web worker support!
    // Some code.....
} else {
    // Sorry! No Web Worker support..
}
为了解决您的WebWorker postMessage错误,可以使用'tsconfig'中的'webworker'库或以下方法:

要解决您的WebWorker postMessage错误,请在WebWorker文件中添加以下代码:

const ctx: Worker = self as any;
...
ctx.postMessage({message:count});

您的代码示例

tstut.js

if(typeof(Worker) !== 'undefined'){
    const worker = new Worker('worker.js');
    worker.postMessage('do some work');
    worker.addEventListener('message', function (e) {
        //console.log(e);
        console.log(e.data);
    });
}

worker.js(这里不需要检查 worker 的支持)

const ctx: Worker = self as any;
ctx.addEventListener('message', (e) => {
    // console.log(e)
    if (e.data === 'do some work') {
        console.log('Worker is about to start some work');
        let count: number = 0;
        for (let i: number = 0; i < 1000; i++) {
            count += i;
        }
        ctx.postMessage({ message: count });
    }
})

代码流程进入else块,并显示不支持WebWorker。我需要在tsconfig.json中进行一些更改吗?tsconfig.json在查询中。 - overexchange
这是因为你在工作线程内部进行了工作线程检查。不需要这样做。 - Bodman
在JS中,我们有SharedWorker对象。我正在尝试使用let worker: SharedWorker = new SharedWorker('worker.js');执行相同的代码,但是我看到错误Cannot find name 'SharedWorker' - overexchange
我能够在安装类型定义后使用以下代码:let worker: SharedWorker.SharedWorker = new SharedWorker('worker.js');,但是 worker.postMessage('do some work'); 不起作用。 - overexchange
根据文档,我认为在.tsconfig文件中应该称之为'webworker'而不是'webworkers'库。 - lambda
对于其他人的疑问,当他说“在tsconfig中使用'webworker'库”时,他的意思是将“webworker”放入tsconfig.json内的“libs”列表中。 - Cerin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接