【问题标题】:How to declare in initialize global variable in TS-Node?如何在 TS-Node 中声明初始化全局变量?
【发布时间】:2020-10-30 16:47:12
【问题描述】:

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

【问题讨论】:

  • 说起来很奇怪——只是你放弃了 webpack 并要求一种方法来添加它的行为? webpack.js.org/configuration/configuration-languages/…
  • @Estradiaz 因为我需要 Webpack 和 TSNode。
  • 嗯,也许我误解了你的问题,所以你想使用这些,但打字稿抱怨,即使你在 .d.ts 文件中提供这些声明?

标签: node.js typescript ts-node


【解决方案1】:

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

【讨论】:

  • 感谢您的回答!抱歉,我的 TypeScript 将声明的全局变量 (Cannot find name '__IS_DEVELOPMENT_BUILDING_MODE__) 放入 declare global {} 后丢失了它们。我更新了我的答案。也许我错过了tsconfig.json 中的某些内容?
  • 为了让它工作,它必须位于一个 module 中,这是一个至少有一个 import/export 语句的文件。确保将您的 declare global 块放在这样的文件中,或者在当前所在的文件中添加一个空的导出语句,例如 export {}
【解决方案2】:

这里的一种方法是你可以在这里使用一个类。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多