【问题标题】:error TS2554: Expected 2-3 arguments, but got 1错误 TS2554:预期 2-3 个参数,但得到 1
【发布时间】:2019-12-20 10:36:27
【问题描述】:

给定tsconfig.json

{

    "compilerOptions": {

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

    ]
  }

folder structure


1)

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

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

如何解决以下打字稿错误?

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

2)

对于下面的工人代码(./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

鉴于scenario 不适合我的情况。

如何解决postMessage() 的以下错误?正在运行tsc

Expecting 2-3 arguments, but got 1

【问题讨论】:

  • 改用if ('Worker' in window)
  • @artem 例如,window.alert 不需要语法 alert in window。为什么 Worker in window 语法应该用于 Worker
  • 但是 Worker,例如,在 typescript DOM 类型中被声明为独立(全局)对象,并且不需要语法 window.Worker
  • @artem Worker in windowwindow.Worker 有何不同?这两种语法不是都意味着window 对象中的属性吗?
  • 是的,是javascript语法,编译时不检查,只在运行时检查

标签: javascript typescript web-worker


【解决方案1】:

Worker 并不依赖于 window 对象。

if (typeof(Worker) !== "undefined") {
    // Yes! Web worker support!
    // Some code.....
} else {
    // Sorry! No Web Worker support..
}

要解决您的 webworker postMessage 错误,请在 tsconfig 或以下使用“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(无需在此处检查工作人员支持)

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 块并显示No webworker support。我需要对tsconfig.json 进行一些更改吗? tsconfig.json 在查询中
  • 这是因为你在工人内部做工人检查。不需要这样做。
  • 在 JS 中,我们有 SharedWorker 对象。我正在尝试使用 let worker: SharedWorker = new SharedWorker('worker.js'); 执行相同的代码,但我看到错误 Cannot find name 'SharedWorker'
  • 我可以在安装类型定义后使用:let worker: SharedWorker.SharedWorker = new SharedWorker('worker.js');,但worker.postMessage('do some work'); 不起作用
  • 我认为根据documentation.tsconfig文件中的'webworker'而不是'webworkers'库。
猜你喜欢
  • 2023-03-11
  • 2020-05-19
  • 2018-05-19
  • 1970-01-01
  • 2019-10-21
  • 2021-07-29
  • 2021-08-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多