TypeScript 模块与全局声
关键知识点:d.ts 文件中的模块化与全局声明
问题描述
当在 .d.ts 文件中添加 import 或 export 语句时,该文件会被 TypeScript 视为模块(module),而不是全局脚本文件。这会导致文件中的声明仅在模块内部可见,而不是全局可见。
// 这会使文件变成模块,声明不再是全局的
import { Api } from './types';
declare var api: Api; // 这个声明只在模块内可见
解决方案
在模块文件中声明全局变量,需要使用 declare global {} 块:
// 使用 import type 只导入类型,不影响运行时
import type { Api } from './types';
declare global {
  var api: Api; // 这个声明会添加到全局作用域
}
TypeScript 模块规则总结
- 
模块识别规则: - 包含顶级 import或export语句的文件被视为模块
- 不包含这些语句的文件被视为全局脚本
 
- 包含顶级 
- 
声明作用域: - 在全局脚本中,declare声明的类型/变量自动添加到全局作用域
- 在模块中,declare声明的类型/变量仅在该模块内可见
 
- 在全局脚本中,
- 
在模块中添加全局声明: - 使用 declare global { ... }块
- 这允许模块文件向全局命名空间添加类型
 
- 使用 
- 
类型导入优化: - 使用 import type而不是import可以确保只导入类型信息
- 这不会影响运行时行为,也不会导致额外的 JavaScript 代码生成
 
- 使用 
实际应用
这种模式在前端项目中特别有用,例如在全局注入 API 客户端时:
- 在 .d.ts文件中声明全局类型
- 在运行时代码中将实际对象赋值给全局变量(如 window.api = api)
- 在整个应用程序中可以直接使用全局变量,同时获得完整的类型支持
这种方式既保持了类型安全,又提供了便捷的全局访问。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号