javascript - TypeScript - 声明真正的全局变量以直接访问,没有窗口、全局或 globalThis
问题描述
我想将一些环境变量传递给前端应用程序。它们作为构建过程的一部分通过替换传递,例如:
if (ENV_IS_PRODUCTION) { ... }
将评估为:if (false) { ... }
在编译的包中(因此它可以被压缩器完全剥离)。
现在我需要一些方法来告诉 TypeScript 这ENV_IS_PRODUCTION
是一个布尔值。我想直接使用它,window.ENV_IS_PRODUCTION
会评估为window.false
所以它不是一个选项。
我最远的就是在本地声明它:
declare const ENV_IS_PRODUCTION: boolean;
但我不知道如何在全球范围内声明它。我尝试将上述本地定义放入 globals.d.ts 但它不起作用。再说一次,我不能使用 window、global 或 globalThis。它必须作为变量直接访问,无需导入它,也无需使用窗口/全局。
解决方案
实际上,事实证明放在 globals.d.ts 中的本地定义应该可以工作。我只是遇到了一些 VS Code 没有启动的问题(在重新启动后工作,但我可能没有注意到,因为 Eslint 单独给出了一个错误 - 我仍然没有解决,但它相当小)。
因此,在这种情况下,解决方案是简单地将其放入 globals.d.ts 中:
declare const ENV_IS_PRODUCTION: boolean;
更新:
导致混淆的 Eslint 错误是因为 Eslnt 似乎无法识别这样定义的类型。解决方案是禁用所有 TypeScript 文件的 no-undef 规则 - 无论如何它都是多余的,因为 tsc 无论如何都不允许未定义的变量。https://github.com/typescript-eslint/typescript-eslint/issues/342
更新 2:
我要补充一点,它最初对我不起作用的另一个原因是,当我在一个 globals.d.ts 中有这个定义和关于 Window 对象的声明时,globals.d.ts 似乎有些问题 - 它也没有用。我决定使用compilerOptions.typeRoots
并将类型文件放在那里而不是使用 globals.d.ts 并且它工作正常。
所以最好的解决方案是:
tsconfig.json
{
...
"compilerOptions": {
...
"typeRoots": [
"./node_modules/@types",
"./src/types"
]
}
}
src/types/env.d.ts
declare const ENV: {
IS_PRODUCTION: boolean
};
推荐阅读
- javascript - 实际点击复选框的书签?
- jupyter-notebook - 增加 Sympy / Ipython Qtconsole 打印宽度大小?
- java - MultiSearchRequest 请求是否以与在 SearchRequest 中添加的顺序相同的顺序返回响应?
- java - Apache VFS 错误。因为它是相对路径,并且没有提供基本 URI
- linux - 去生成“路径中找不到可执行文件”
- python - Azure 中的 Python Web Scraper
- javascript - 在检索期间返回一个承诺对象
- javascript - 如何为单页产品提供信息
- python-3.x - 如何使用python解决循环导入的问题
- git - 如何使 git 子模块文件在父仓库中可用?