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

4

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

enter image description here


说实话,这样说有点奇怪——你是不是想放弃使用Webpack,然后寻找一种添加其行为的方法呢?https://webpack.js.org/configuration/configuration-languages/#typescript - Estradiaz
@Estradiaz 因为我需要同时使用Webpack和TSNode。 - Takeshi Tokugawa YD
嗯,也许我误解了你的问题,所以你想使用那些类型,但是即使你在.d.ts文件中提供了这些声明,TypeScript仍然会抱怨? - Estradiaz
2个回答

3

步骤一:让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;

谢谢您的回答!很抱歉,我在将声明的全局变量(Cannot find name '__IS_DEVELOPMENT_BUILDING_MODE__')放入 declare global {} 后,我的 TypeScript 丢失了它们。我已经更新了我的答案。也许我在 tsconfig.json 中漏掉了什么? - Takeshi Tokugawa YD
2
为了使其正常工作,它必须位于一个“模块”中,即至少有一个导入/导出语句的文件中。请确保将您的declare global块放在这样的文件中,或者向当前文件添加一个空的导出语句,如export {} - Karol Majewski

0

这里有一种方法,你可以使用一个类,像这样。

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

然后在你的代码中使用 import 进行调用。

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接