globalThis对象的类型是什么?如何定义类似的模块类型?
关于globalThis的类型与模块类型的解析
1. globalThis的实际类型
在运行时,标准JavaScript中typeof globalThis的结果始终是object——globalThis是指向全局对象的标准引用,浏览器中对应window,Node.js中对应global,本质是普通对象。
你在VSCode中看到typeof globalThis结果为module,是因为当前文件是ES模块(.mjs后缀,或package.json中设置了"type": "module"):ES模块的顶层作用域中,this并不指向全局对象,而是指向当前模块的模块命名空间对象。VSCode的TypeScript类型检查器会把这个对象的类型标识为module,这是类型层面的提示,而非运行时的实际typeof结果。
2. 什么是"module"类型
这里的module类型是TypeScript对ES模块命名空间对象的类型描述:每个ES模块都会生成一个模块命名空间对象,包含该模块所有导出成员,其类型由TypeScript自动推导,完全匹配模块的导出结构。比如一个导出foo和bar的模块,它的模块命名空间对象类型会包含foo和bar的具体类型定义。
3. 用declare global扩展全局类型
在ES模块中,顶层this指向的是当前模块对象,直接扩展this的类型只会作用于当前模块。如果要扩展globalThis对应的全局对象类型,必须使用declare global块:
declare global { interface GlobalThis { myCustomProp: string; } } // 此时使用globalThis.myCustomProp会通过类型检查 globalThis.myCustomProp = "test";
4. 定义类似globalThis的模块类型
如果要手动模拟模块命名空间对象的类型,可以用interface来描述其结构,结合模块导出的特性:
// 定义自定义模块类型 interface CustomModule { // 模块导出的成员 export1: number; export2: () => void; // 环境相关的模块属性(如Node.js中的__dirname) __dirname?: string; } // 模拟符合该类型的模块对象 const myModule: CustomModule = { export1: 123, export2: () => console.log("hello"), __dirname: "/path/to/module" };
如果是为现有模块补充类型,通常编写.d.ts声明文件,直接描述模块的导出类型即可。
内容的提问来源于stack exchange,提问作者Devin Johw
相关产品推荐
相关产品推荐

