Typescript:如何在不使用 `as any` 的情况下声明全局变量?

25 浏览
0 Comments

Typescript:如何在不使用 `as any` 的情况下声明全局变量?

在JavaScript中,我可以这样做:

 something = 'testing';

然后在另一个文件中:

 if (something === 'testing')

并且它将定义something(只要它们按正确的顺序调用)。

但我似乎无法弄清楚如何在TypeScript中做到这一点。

这是我尝试过的方法。

在一个 .d.ts 文件中:

interface Window { something: string; }

然后在我的 main.ts 文件中:

 window.something = 'testing';

然后在另一个文件中:

 if (window.something  === 'testing')

这样可以工作。但是我想要能够省略其中的 window. 部分,只需要全局使用我的 something。在TypeScript中有没有办法做到这一点呢?

(如果有人感兴趣,我真的在尝试为我的应用程序设置日志记录。我希望能够在任何文件中调用log.Debug而不必导入和创建对象。)

0
0 Comments

在TypeScript中声明全局变量的方法有很多种,但是如果不想使用`any`类型的话,可以按照以下步骤进行操作:

步骤1:

在项目中创建一个名为`custom.d.ts`的文件,声明一个全局的命名空间`NodeJS.Global`,并在其中添加一个全局变量`Config`,类型为一个空对象`{}`。

代码如下:

declare global {
    namespace NodeJS {
        interface Global {
            Config: {}
        }
    }
}
export default global;

步骤2:

将上述创建的文件路径添加到项目的`tsconfig.json`文件中的`typeRoots`字段中。

代码如下:

"typeRoots": ["src/types/custom.d.ts" ]

步骤3:

在任意文件中,可以通过`global.config`来获取上述创建的全局变量。

代码如下:

console.log(global.config)

需要注意的是:

1. TypeScript的版本为"3.0.1"。

2. 在本例中,要求在应用程序启动之前设置全局变量,并且该变量应该在所有依赖对象中都可访问,以便获取所需的配置属性。

3. 在Node 16中,可以使用`declare global { var whatever: type }`来声明全局变量。

希望这可以帮助到你!感谢阅读!

0
0 Comments

在TypeScript中,如果想要声明一个全局变量而不使用any,可以采取以下解决方法:

首先,在.d.ts定义文件中,声明一个类型为MyGlobalFunctionType的全局函数类型:

type MyGlobalFunctionType = (name: string) => void;

接下来,如果是在浏览器中工作,可以将成员添加到浏览器的window上下文中:

interface Window {
  myGlobalFunction: MyGlobalFunctionType;
}

对于Node.js也是同样的思路:

declare module NodeJS {
  interface Global {
    myGlobalFunction: MyGlobalFunctionType;
  }
}

然后,声明一个实际上会存在于window或global上的根变量:

declare const myGlobalFunction: MyGlobalFunctionType;

最后,在普通的.ts文件中,作为副作用导入,并实现该全局函数:

global.myGlobalFunction = function (name: string) {
  console.log("Hey !", name);
};

最后,在代码库的其他地方可以使用该全局函数:

global.myGlobalFunction("Kevin");
myGlobalFunction("Kevin");

需要注意的是,这种方式需要额外的工作来创建一个简单的全局变量。有人问到了“but imported as side-effect”的部分含义,这里是指作为副作用导入。如果在.tsx文件中使用window.myGlobalFunction,可能需要进行其他更改。关于如何放置d.ts文件以及如何配置TypeScript加载它的问题,可以根据具体情况进行调整。需要注意的是,文件名中不能有额外的点,即*.d.ts文件应该避免使用额外的点,例如some.global.d.ts无法正确识别,而some-global.d.ts可以(使用破折号代替第一个点)。有人问到为什么TypeScript的全局对象键具有any类型,这个问题可能需要进一步的了解。对于Node代码,有人指出该方法已经过时,可以直接使用declare global { var whatever }

这种方法可能会被认为过于复杂,但它提供了一种在TypeScript中声明全局变量而不使用any的解决方案。

0
0 Comments

Typescript: 如何在不使用 as any 的情况下声明全局变量?

在Typescript中,如果想要声明一个全局变量,可以使用var关键字或者使用declaration-merging来扩展全局作用域。但是,有人想知道如何在不使用var关键字的情况下声明全局变量并进行类型扩展。

在Typescript中,文件有两种作用域:全局作用域和模块作用域。

1. 全局作用域:如果文件中没有import或export语句,该文件将在全局作用域中执行,其中的所有声明都对该文件外部可见。可以使用以下方式创建全局变量:

// xx.d.ts
declare var age: number
// 或者
// xx.ts
// with or without declare keyword
var age: number
// other.ts
globalThis.age = 18 // 不会报错

需要注意的是,必须使用var关键字来创建全局变量,使用let或const关键字是不行的。

2. 模块作用域:如果文件中有import或export语句,该文件将在其自己的作用域中执行,这时我们需要通过declaration-merging来扩展全局作用域。

// xx[.d].ts
declare global {
  var age: number;
}
// other.ts
globalThis.age = 18 // 不会报错

需要注意的是,模块作用域需要使用declaration-merging来扩展全局作用域。关于模块作用域的更多信息可以参考官方文档。

但是,如何在不使用var关键字的情况下进行类型扩展呢?答案是var关键字是必需的,但是可以只声明变量而不进行初始化。

// xx.d.ts
declare var age: number;
// 或者
// xx.ts
var age: number;
// other.ts
globalThis.age = 18 // 不会报错

尽管这种方法可以工作,但是编译器仍然会发出警告:Element implicitly has an 'any' type because type 'typeof globalThis' has no index signature.而且添加//-ignore注释并不是一个好的做法。

,要在Typescript中声明全局变量而不使用as any,可以使用var关键字声明变量,或者使用declaration-merging来扩展全局作用域。

0