如何声明全局类型?

搞TypeScript项目,总有那么几个类型是你想随手拿来就用的,不想在每个文件里翻来覆去地导入。这就是全局类型的用武之地了。今天就跟大伙儿聊聊怎么把这玩意儿安排明白,顺便说说哪里是坑。

最省事的法子,是弄个.d.ts声明文件。你直接在项目根目录或者src下面创建一个,比如叫globals.d.ts。里面的写法很直接:

declare type MyGlobalType = {
  id: string;
  name: string;
};

declare interface CommonConfig {
  env: string;
  version: string;
}

注意那个declare关键字,它相当于向类型系统宣告:“这东西存在,你别管具体在哪儿,认它就完了。” 只要这个文件被你的tsconfig.json包含在编译范围里(通常默认就包含),那在整个项目中,MyGlobalTypeCommonConfig就可以直接用了,跟stringnumber这些内置类型一样方便。

还有一种特别常见的需求:给现有的全局对象“打补丁”。比如说你在window对象上挂了个自己写的小工具,TypeScript一开始可不认识它。

// 假设你在某个js里写了:window.myHelper = function() {...}
// 为了让TS不报错,在.d.ts里这么补:
declare global {
  interface Window {
    myHelper: () => void;
  }
}

这么一声明,window.myHelper就有类型了,代码提示和检查都回来了。给Promise或者Array这类内置原型加自定义方法,思路也差不多。

但是啊,老兄,听我一句劝:全局类型这玩意儿,权力越大责任越大,得慎用。我以前见过一个项目,把几十个业务类型全塞进全局,后期改名都不敢,生怕哪个角落的代码崩掉。我自己的经验是,只把那些真正通用、稳定、且被无数文件频繁使用的基础类型放进去。比如全公司统一的API响应格式、几个核心的实体模型。那些只属于某个特定模块或功能的类型,还是老老实实放在各自文件夹里,用importexport来管理。这样依赖清晰,以后也好拆分。

对了,控制全局类型的范围还有个更优雅的办法。你可以在一个普通的.ts文件里(比如src/types/index.ts)集中导出所有公共类型,然后在项目的入口文件(比如main.tsapp.tsx)最开头import './types'一下。这样一来,这些类型虽然没有被“声明全局”,但因为一开始就被加载,后续所有文件也都能间接访问到,既实现了共享,又保持了清晰的依赖关系,算是折中之道。

最后别忘了检查一下tsconfig.json里的includeexcludetypeRoots这些配置项,它们决定了编译器去哪儿找你的类型声明。搞明白了这些,你才算真正拿捏了全局类型。

© 版权声明
THE END
喜欢就支持一下吧
点赞7 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容