TypeScript - 声明真正的全局变量以直接访问,没有 window、global 或 globalThis
TypeScript - declare truly global variable to access directly, no window, global or 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。它必须作为变量直接访问,无需导入它,也无需使用 window/global.
实际上,放入 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
};
我想将一些环境变量传递给前端应用程序。它们作为构建过程的一部分通过替换传递,例如:
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。它必须作为变量直接访问,无需导入它,也无需使用 window/global.
实际上,放入 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
};