Typescript:如何在不使用 `as any` 的情况下声明全局变量?
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
而不必导入和创建对象。)
在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 }`来声明全局变量。
希望这可以帮助到你!感谢阅读!
在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
的解决方案。
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来扩展全局作用域。