在TypeScript中创建全局变量

在TypeScript中创建全局变量,typescript,Typescript,在JavaScript中,我可以这样做: something = 'testing'; 然后在另一个文件中: if (something === 'testing') if (window.something === 'testing') 它将定义某些东西(只要它们以正确的顺序被调用) 我似乎不知道如何在TypeScript中做到这一点 这就是我尝试过的 在.d.ts文件中: interface Window { something: string; } 然后在我的main.ts

在JavaScript中,我可以这样做:

 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
    (请参见和)的另一个答案,因为该行为相当混乱。所有示例都在Nodejs
    v12.14.1
    和TypeScript
    Version 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
    
    输出来自Nodejs
    v12.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;