使用更具体的示例(仅 TypeScript 不与 JavaScript 混合)扩展关于 globalThis(参见 MDN 和 TypeScript 3.4 note)的其他答案,因为该行为相当令人困惑。所有示例都在 Nodejs v12.14.1 和 TypeScript Version 4.2.3 下运行。
具有全局范围的最简单情况
declare var ENVIRONMENT: string;
globalThis.ENVIRONMENT = 'PROD';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// output
// PROD
// PROD
此文件不是import 或export,因此它是一个全局范围文件。您可以编译上述 TypeScript 代码而不会出现任何错误。请注意,您必须使用var。使用let 会抛出error TS2339: Property 'ENVIRONMENT' does not exist on type 'typeof globalThis'.
您可能会注意到我们declared 变量,而不是下面的变量。
var ENVIRONMENT: string;
ENVIRONMENT = 'DEV';
globalThis.ENVIRONMENT = 'PROD';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// output
// DEV
// PROD
输出来自 Nodejs v12.14.1。我还在 Chrome 中对其进行了测试(编译为 JS 之后)并输出PROD。所以我建议一直使用globalThis。
具有模块范围的简单案例
declare var ENVIRONMENT: string;
globalThis.ENVIRONMENT = 'PROD';
export {};
一旦我们添加export语句,它就变成了一个模块范围文件,它抛出error TS7017: Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.解决方案是augment global scope。
declare global {
var ENVIRONMENT: string;
}
globalThis.ENVIRONMENT = 'PROD';
console.log(globalThis.ENVIRONMENT);
export {};
你仍然必须使用var,否则你会得到error TS2339: Property 'ENVIRONMENT' does not exist on type 'typeof globalThis'.。
导入副作用
// ./main.ts
import './environment_prod';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// ./environment_prod.ts
declare var ENVIRONMENT: string;
globalThis.ENVIRONMENT = 'PROD';
或者
// ./environment_prod.ts
declare global {
var ENVIRONMENT: string;
}
globalThis.ENVIRONMENT = 'PROD';
export {}; // Makes the current file a module.
浏览两个文件
假设main.ts 和environment_prod.ts 都是入口文件。 Browserify 会将它们(在编译为 JS 之后)包装到需要使用 globalThis 的本地作用域函数中。
// ./main.ts
declare var ENVIRONMENT: string;
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// ./environment_prod.ts
declare var ENVIRONMENT: string;
globalThis.ENVIRONMENT = 'PROD';
但是共享一个声明文件更安全,然后可以由两个入口文件导入,以避免变量名或类型名的拼写错误。
// ./main.ts
import './environment';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// ./environment_prod.ts
import './environment';
globalThis.ENVIRONMENT = 'PROD';
// ./environment.ts
type Environment = 'PROD' | 'DEV' | 'LOCAL';
declare var ENVIRONMENT: Environment;
注意顺序很重要:browserify environment_prod.js main.js > bin.js