在TypeScript中创建全局变量
在JavaScript中,我可以这样做:在TypeScript中创建全局变量,typescript,Typescript,在JavaScript中,我可以这样做: something = 'testing'; 然后在另一个文件中: if (something === 'testing') if (window.something === 'testing') 它将定义某些东西(只要它们以正确的顺序被调用) 我似乎不知道如何在TypeScript中做到这一点 这就是我尝试过的 在.d.ts文件中: interface Window { something: string; } 然后在我的main.ts
something = 'testing';
然后在另一个文件中:
if (something === 'testing')
if (window.something === 'testing')
它将定义某些东西(只要它们以正确的顺序被调用)
我似乎不知道如何在TypeScript中做到这一点
这就是我尝试过的
在.d.ts文件中:
interface Window { something: string; }
然后在我的main.ts文件中:
window.something = 'testing';
然后在另一个文件中:
if (something === 'testing')
if (window.something === 'testing')
这是有效的。但是我希望能够丢失窗口。
部分,只需要让我的东西成为全局的。在TypeScript中是否有这样做的方法?
(如果有人感兴趣,我真的在尝试为我的应用程序设置日志记录。我希望能够从任何文件调用log.Debug
,而不必导入和创建对象。)我找到了一种方法,如果我使用JavaScript和TypeScript相结合,它可以工作
d.T.S:
declare var log: log4javascript.Logger;
日志声明。js:
log = null;
initalize-app.ts
import './log-declaration.js';
// Call stuff to actually setup log.
// Similar to this:
log = functionToSetupLog();
这将它放在全局范围内,TypeScript知道它。所以我可以在我所有的文件中使用它
注意:我认为这仅仅是因为我将allowJs
TypeScript选项设置为true
如果有人发布纯打字脚本解决方案,我会接受。好的,所以这可能比你做的更难看,但无论如何
但我也这么做,所以
在纯TypeScript中,您可以使用eval
函数,如下所示:
declare var something: string;
eval("something = 'testing';")
以后你就能做到了
if (something === 'testing')
这只不过是一种在TypeScript拒绝编译的情况下强制执行指令的黑客行为,我们为TypeScript声明var
来编译其余的代码。在.d.ts
定义文件中
type MyGlobalFunctionType = (name: string) => void
如果在浏览器中工作,
将成员添加到浏览器的窗口上下文:
interface Window {
myGlobalFunction: MyGlobalFunctionType
}
NodeJS也有同样的想法:
declare module NodeJS {
interface Global {
myGlobalFunction: MyGlobalFunctionType
}
}
现在声明根变量(它将实际存在于window或global上)
然后在一个常规的.ts
文件中,但作为副作用导入,您实际上实现了它:
global/* or window */.myGlobalFunction = function (name: string) {
console.log("Hey !", name);
};
最后,在代码库中的其他地方使用它,方法如下:
global/* or window */.myGlobalFunction("Kevin");
myGlobalFunction("Kevin");
我只用这个
import {globalVar} from "./globals";
declare let window:any;
window.globalVar = globalVar;
作为Dima V答案的一个补充,这就是我所做的,让它为我工作
//首先在类外部声明全局窗口
声明let窗口:任意代码>
//在所需的类方法中
让globVarName=window.globVarName代码>我就是这样修复的:
步骤:
声明了一个全局命名空间,例如custom.d.ts,如下所示:
声明全局{
名称空间节点{
接口全局{
配置:{}
}
}
}
导出默认全局;
将上面创建的文件映射到“tsconfig.json”,如下所示:
在任何文件中获取上述创建的全局变量,如下所示:
console.log(global.config)
注意:
打字稿版本:“3.0.1”
在我的例子中,要求是在启动应用程序之前设置全局变量,并且该变量应该访问整个依赖对象,以便我们能够获得所需的配置属性
希望这有帮助
谢谢你是未来
首先,TypeScript文件有两种作用域
全球范围
如果您的文件没有任何导入
或导出
行,则此文件将在全局范围内执行,其中的所有声明在此文件外可见
因此,我们将创建如下全局变量:
//xx.d.ts
声明变量年龄:数字
//或
//xx.ts
//带或不带declare关键字
变量年龄:数字
//其他
globalThis.age=18//无错误
所有的魔法都来自var
。将var
替换为let
或const
将不起作用
模块范围
如果您的文件有任何导入
或导出
行,则此文件将在其自身范围内执行,我们需要通过扩展全局
//xx[.d].ts
宣布全球{
变量年龄:个数;
}
//其他
globalThis.age=18//无错误
您可以在中查看有关模块的更多信息
我花了几个小时来找出正确的方法。在我的例子中,我试图定义全局“log”变量,因此步骤如下:
1) 将tsconfig.json
配置为包含定义的类型(src/types
文件夹、节点模块-由您决定):
2) 创建包含以下内容的文件src/types/global.d.ts
(无导入!-这很重要),如果使用浏览器,请随意更改任何,以满足您的需要+使用窗口
界面而不是节点
:
/**
* IMPORTANT - do not use imports in this file!
* It will break global definition.
*/
declare namespace NodeJS {
export interface Global {
log: any;
}
}
declare var log: any;
3) 现在,您终于可以在需要的地方使用/实现log
:
// in one file
global.log = someCoolLogger();
// in another file
log.info('hello world');
// or if its a variable
global.log = 'INFO'
我需要使lodash全局化,以使用一个现有的.js文件,我无法更改它,只需要
我发现这是有效的:
import * as lodash from 'lodash';
(global as any)._ = lodash;
这对我有效,如中所述:
我用这个:
interface Window {
globalthing: any;
}
declare var globalthing: any;
使用更具体的示例(仅限于TypeScript而不与JavaScript混合)扩展关于globalThis
(请参见和)的另一个答案,因为该行为相当混乱。所有示例都在Nodejsv12.14.1
和TypeScriptVersion 4.2.3
下运行
具有全局范围的最简单情况
此文件不导入
或导出
,因此它是一个全局作用域文件。您可以编译上面的TypeScript代码,而不会出现任何错误。请注意,您必须使用var
。使用let
将抛出错误TS2339:类型“typeof globalThis”上不存在属性“ENVIRONMENT”。
您可能会注意到,我们声明了d变量,而下面的方法同样有效
var ENVIRONMENT: string;
ENVIRONMENT = 'DEV';
globalThis.ENVIRONMENT = 'PROD';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// output
// DEV
// PROD
输出来自Nodejsv12.14.1
。我也会打电话
interface Window {
globalthing: any;
}
declare var globalthing: any;
declare var ENVIRONMENT: string;
globalThis.ENVIRONMENT = 'PROD';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// output
// PROD
// PROD
var ENVIRONMENT: string;
ENVIRONMENT = 'DEV';
globalThis.ENVIRONMENT = 'PROD';
console.log(ENVIRONMENT);
console.log(globalThis.ENVIRONMENT);
// output
// DEV
// PROD
declare var ENVIRONMENT: string;
globalThis.ENVIRONMENT = 'PROD';
export {};
declare global {
var ENVIRONMENT: string;
}
globalThis.ENVIRONMENT = 'PROD';
console.log(globalThis.ENVIRONMENT);
export {};
// ./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
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;