如何在 TS-Node 中声明初始化全局变量?

How to declare in initialize global variable in TS-Node?

使用 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 是否允许这样的事情。

更新

在我将声明的全局变量放入 declare global {}:

之后,我的 TypeScript 丢失了声明的全局变量

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__'.

一种方法是您可以在这里使用 class。

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

然后在您的代码中使用 import like。

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

第 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;