webpack - TypeScript: Deklarer forskjellige biblioteker/referanser for forskjellige filer innenfor samme prosjekt


Jeg har et prosjekt som er skrevet i TypeScript. Jeg bruker både DOM og Web Workers, så jeg trenger webworker.d.ts-biblioteket i noen filer og dom.d.ts i andre filer.

Jeg har allerede prøvd å legge til "webworker" i lib-alternativet i tsconfig.json, men de to er inkompatible.

En annen ting jeg prøvde er å legge til:

/// <reference no-default-lib="true"/>
/// <reference lib="esnext" />
/// <reference lib="webworker" />

på toppen av servicearbeider-filen min, men "webworker" brukes på hver fil i stedet for bare den som inkluderer referansene.

Hvordan kan jeg ha både filer som trenger referanser til DOM og filer som trenger referanser til webworker i samme prosjekt?

Her er min konfigurasjon:

// tsconfig.json
{
  "compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "strict": true,
    "jsx": "preserve",
    "importHelpers": true,
    "noEmitHelpers": false,
    "moduleResolution": "node",
    "experimentalDecorators": true,
    "esModuleInterop": true,
    "allowSyntheticDefaultImports": true,
    "sourceMap": true,
    "baseUrl": ".",
    "types": ["webpack-env"],
    "paths": {
      "@/*": ["src/*"]
    },
    "lib": ["esnext", "dom", "dom.iterable", "scripthost"]
  },
  "include": [
    "src/**/*.ts",
    "src/**/*.tsx",
    "src/**/*.vue",
    "tests/**/*.ts",
    "tests/**/*.tsx"
  ],
  "exclude": ["node_modules"]
}

Svar #1

Med vue se Microsoft/TypeScript/issues/20595 som sier:

We have found that what is meaningful in the global scope of a web worker is significantly more narrow than we find out of the DOM. So we tend to author with "lib": [ "dom" ] and then just declare the handful of APIs we require to make a web worker work, or we obtain a reference to the global object, treat it as any, and pick off certain properties from the global scope and type them at the point where we pick them off.

Prøv som:

const ctx: Worker = self as any;
ctx.postMessage();

ELLER: Følg den lenkede 20595-oppskriften som vil kreve satt opp typografi for noen webarbeiderdeler eller lage typefiler for komponentene du trenger/bruke.

Bruk :

const globalObject: any = (function (): any {
if (typeof global !== 'undefined') {
    // global spec defines a reference to the global object called 'global'
    // https://github.com/tc39/proposal-global
    // `global` is also defined in NodeJS
    return global;
}
else if (typeof window !== 'undefined') {
    // window is defined in browsers
    return window;
}
else if (typeof self !== 'undefined') {
    // self is defined in WebWorkers
    return self;
}
})();

Referer da for eksempel ved:

import globalObject from 'globalObject'
globalObject.postMessage({});

Relaterte artikler