【问题标题】:How to migrate service worker from JS to TS如何将 service worker 从 JS 迁移到 TS
【发布时间】:2020-11-16 20:14:56
【问题描述】:

场景

我想将我的 service-worker 文件从 javascript 更改为 typescript 以便更好地维护。 这是我的 sw.js 文件:

/* eslint-disable no-console */
self.addEventListener("push", (event) => {
  ...
});
...more handlers

问题

我已经更改了很多行以使我的代码适应 TS 和 ESlint 要求,但我对 self 有问题我从 ESlint 收到 2 个错误:

unexpected use of 'self' 
self is not defined

如何在 Typescript 文件中定义 self?

【问题讨论】:

标签: typescript eslint service-worker


【解决方案1】:

tsconfig.json文件中需要添加webworker

{
 ....
  "compilerOptions": {
  "lib": [
    ...
    "webworker"
  ],...
}

添加 webworker 库后,可以使用 typescript ServiceWorkerGlobalScope 声明 self。

ServiceWorker API 的ServiceWorkerGlobalScope 接口代表了一个ServiceWorker 的全局执行上下文。

declare const self: ServiceWorkerGlobalScope;

如果您在 tsconfig.json 中将 isolatedModules 标志设置为 true,那么您还需要在您的 service worker 文件中添加一些导入或导出指令,因为:

Typescript 将没有导入/导出的文件视为遗留脚本文件。由于此类文件不是模块,因此它们已合并到全局命名空间中的任何定义。 isolatedModules 标志禁止此类文件。

如果您不需要任何导入或导出方便的方式来制作文件模块,请添加 export { }; stack question describing this problem

最后可以在sw.ts 文件中使用完整的打字稿语法。

【讨论】:

  • 很遗憾,“WebWorker”与“DOM”不兼容。将两者都添加到“lib”会导致错误:“lib.dom.d.ts(25,1): error TS6200: 以下标识符的定义与另一个文件中的标识符冲突”。更多详情:github.com/microsoft/TypeScript/issues/14877
猜你喜欢
  • 2017-05-26
  • 2023-02-15
  • 1970-01-01
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
相关资源
最近更新 更多