TypeScript: объявление разных библиотек / ссылок для разных файлов в одном проекте - PullRequest
0 голосов
/ 14 января 2019

У меня есть проект, который написан на TypeScript. Я использую как dom, так и Web Workers, поэтому мне нужна библиотека webworker.d.ts в некоторых файлах и dom.d.ts в других файлах.

Я уже пытался добавить "webworker" в опцию lib в tsconfig.json, но эти два несовместимы.

Ещё я попробовал добавить:

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

вверху моего файла рабочего сервиса, но «webworker» применяется к каждому файлу, а не только к тому, который включает ссылки.

Как я могу иметь как файлы, которые нуждаются в ссылках на dom, так и файлы, которые нуждаются в ссылках на веб-работника в рамках одного проекта?

Вот мой конфиг:

// 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"]
}

1 Ответ

0 голосов
/ 26 января 2019

С vue см. Microsoft / TypeScript / Issues / 20595 , в котором говорится:

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.

Попробуйте как:

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

ИЛИ: следуйте связанному рецепту 20595 , который потребует набора текста для некоторых деталей веб-рабочего или создания файлов типов для компонентов, которые вам нужны / используются.

Использование:

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;
}
})();

Затем укажите ссылку, например:

import globalObject from 'globalObject'
globalObject.postMessage({});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...