如何在 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。
概念层面的解决方案
- 创建文件并初始化全局变量(如
globalThis.__IS_DEVELOPMENT_BUILDING_MODE__ = false
?)
- 告诉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;
使用 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。
概念层面的解决方案
- 创建文件并初始化全局变量(如
globalThis.__IS_DEVELOPMENT_BUILDING_MODE__ = false
?) - 告诉TSNode先执行这个文件。
现在的问题是 TSNode 是否允许这样的事情。
更新
在我将声明的全局变量放入 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__'.
一种方法是您可以在这里使用 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;