Short version: TypeScript's lib: ['DOM']
does not include Service Worker types, but @types/service_worker_api
says it does.
I have a working TypeScript service worker. It has no problems other than I have to use // @ts-nocheck
at the top of the file, because TypeScript can't handle the service worker types.
Similar to TypeScript type definitions for ServiceWorker, I originally followed the instructions to install the types for service_worker_api
:
$ npm install --save @types/service_worker_api
npm WARN deprecated @types/service_worker_api@0.0.9: ServiceWorker types are now provided by '--lib dom'
So modifying my tsconfig accordingly:
{
"compilerOptions": {
"rootDir": "src",
"composite": true,
"module": "es2020",
"moduleResolution": "Node",
// Resulting files will be in dist/service-worker.js
"outDir": "dist",
// From "@types/service_worker_api@0.0.9: ServiceWorker types are now provided by '--lib dom'"
"lib": ["DOM"]
},
"include": ["src/service-worker.ts"]
}
This fails with:
$ npx tsc --project tsconfig.serviceworker.json
src/service-worker.ts(27,34): error TS2339: Property 'clients' does not exist on type 'Window & typeof globalThis'.
src/service-worker.ts(51,8): error TS2339: Property 'skipWaiting' does not exist on type 'Window & typeof globalThis'.
I also tried WebWorker
- though I know WebWorker isn't quite the same as a service worker - and that fails with
src/service-worker.ts(66,56): error TS2339: Property 'data' does not exist on type 'Event'.
src/service-worker.ts(67,23): error TS2339: Property 'data' does not exist on type 'Event'.
What is the correct tsconfig.json
for a service worker?
There’s a new @types/serviceworker
from Microsoft (see, the release notes for more details) that should definitely solve the issue.
Mine was a bit different, since I got here looking how-to solve an issue with waitUntil()
, then I solved it by just setting ExtendableEvent
as the event type on the service worker listeners.