【问题标题】:How do I strongly type a TypeScript web worker file with postMessage?如何使用 postMessage 强烈键入 TypeScript Web Worker 文件?
【发布时间】:2018-08-03 15:37:53
【问题描述】:

我有一个想用 TypeScript 编写的网络工作者。

问题是Worker.postMessage - TypeScript 假定每个脚本都将在窗口上下文中加载,因此需要 Window.postMessage,它具有不同的语法。

这意味着当我尝试使用 postMessage 时,TypeScript 会引发错误。

有一些方法可以解决这个问题,例如通过重新定义函数declare function postMessage(message: any),但其中大多数充其量只是丑陋的组合 - TS 的全部意义在于检查类型,声明我自己的虚拟对象会打败它。

出于同样的原因 - window(及其上下文中的所有内容)在此上下文中不可用,应该被 TS 视为错误。例如alert('message') 应该导致 TS 警告,而不是运行时错误。

有什么方法可以让文件获取实际定义(来自webworker.es2016.d.ts)并以某种方式告诉 TypeScript 这段代码将在工作上下文而不是窗口中运行?

【问题讨论】:

    标签: typescript web-worker typescript-typings


    【解决方案1】:

    如果您检查compiler options,您会看到--lib 有一个网络工作者选项。问题是你不能同时为 web worker 编译常规代码和代码。您可以将您的网络工作者代码与它自己的 tsconfig.json 放在一个单独的文件夹中,并单独耦合它:

    "compilerOptions" : {
        "target": "es2015",
        "lib": [
            "es2015"
            "webworker"
        ]
    }
    

    或者您可以为 webworker 代码显式调用编译器:

    tsc .\sample.ts -lib es2015,webworker
    

    【讨论】:

    • 不幸的是,我希望能够import 一些相同的库,因此一个有效的独立 TS 项目并不是一个很好的解决方案。这是唯一的方法吗?
    • @Keith 查看这个 GitHub 问题以获得解决方法,也许你可以应用它:github.com/Microsoft/TypeScript/issues/20595
    猜你喜欢
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 2022-10-01
    • 2021-01-05
    相关资源
    最近更新 更多