Как объявить в инициализации глобальную переменную в TS-Node? - PullRequest
3 голосов
/ 10 июля 2020

С Webpack:

const WebpackConfig = {
  // ...
  plugins: [
    new Webpack.DefinePlugin({
      __IS_DEVELOPMENT_BUILDING_MODE__: isDevelopmentBuildingMode,
      __IS_TESTING_BUILDING_MODE__: isTestingBuildingMode,
      __IS_PRODUCTION_BUILDING_MODE__: !isDevelopmentBuildingMode && !isTestingBuildingMode
    })
  ]
}

Теперь я собираюсь использовать TS-Node вместо Webpack. TS-Node не видит эти константы:

ErrorsReportingService.ts:35:9 - error TS2304: Cannot find name '__IS_DEVELOPMENT_BUILDING_MODE__'.

Как инициализировать эти глобальные переменные для TS-Node?

Конечно, для этих констант предоставляется типизация:

declare const __IS_DEVELOPMENT_BUILDING_MODE__: boolean;
declare const __IS_TESTING_BUILDING_MODE__: boolean;
declare const __IS_PRODUCTION_BUILDING_MODE__: boolean;

Обратите внимание, что мне нужны и Webpack, и TSNode.

Решение на концептуальном уровне

  1. Создать файл и инициализировать глобальные переменные (например, globalThis.__IS_DEVELOPMENT_BUILDING_MODE__ = false?)
  2. Скажите TSNode выполнить этот файл первым.

Теперь вопрос в том, разрешает ли TSNode такие вещи или нет.

Обновление

Мой TypeScript потерял объявленные глобальные объекты после Я поместил их внутрь declare global {}:

typings.d.ts

declare global {
  let __IS_DEVELOPMENT_BUILDING_MODE__: boolean;
  let __IS_TESTING_BUILDING_MODE__: boolean;
  let __IS_PRODUCTION_BUILDING_MODE__: boolean;
}

Теперь компилятор их не видит:

TS2304: Cannot find name '__IS_DEVELOPMENT_BUILDING_MODE__'.

введите описание изображения здесь

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Шаг 1. Сделайте TypeScript осведомленным о ваших глобальных объектах

Канонический способ определения глобальных объектов, которые существуют как в Node.js, так и на сервере, заключается в использовании ключевого слова var.

declare global {
  var __IS_DEVELOPMENT_BUILDING_MODE__: boolean;
  var __IS_TESTING_BUILDING_MODE__: boolean;
  var __IS_PRODUCTION_BUILDING_MORE__: boolean;
}

Это делает их доступными через globalThis и путем прямого обращения к ним.

globalThis.__IS_DEVELOPMENT_BUILDING_MODE__;
__IS_DEVELOPMENT_BUILDING_MODE__;

Шаг 2: Определите их на клиенте

Это то, что Webpack.DefinePlugin уже делает для вас.

Шаг 3. Определите их на сервере

Найдите точку входа вашего Node-приложения и определите

var __IS_DEVELOPMENT_BUILDING_MODE__ = true;

Обычной практикой является использование переменных среды.

var __IS_DEVELOPMENT_BUILDING_MODE__ = process.env.NODE_ENV === 'development;
1 голос
/ 10 июля 2020

здесь можно использовать класс, например.

export class Config{
/*add field like this*/
 __IS_DEVELOPMENT_BUILDING_MODE__: boolean;
 __IS_TESTING_BUILDING_MODE__: boolean;
 const __IS_PRODUCTION_BUILDING_MODE__: boolean;
}

, а затем использовать в своем коде, используя импорт, например.

import {Config} from 'your file location'
Config.your_variable_name
...