TypeScript全局类型定义的方式
内容提要
TypeScript中定义全局类型的几种常见方式:使用declare global命名空间、使用declare module命名空间覆盖第三方包的类型定义、使用全局模块类型声明。
延伸解读
declare global 的 export 陷阱
文章特别提醒,使用 declare global 定义全局类型时,文件内部必须包含至少一个 export 语句,否则声明不会生效。这是因为 TypeScript 将没有 import 或 export 的文件视为全局脚本,其中的 declare global 会被忽略。因此,在 .d.ts 文件中添加 export {} 是常见做法,确保文件被视为模块,从而让 declare global 内的声明真正作用于全局。
覆盖第三方类型:以 axios 为例
文章展示了如何通过 declare module 覆盖 axios 的类型定义。axios 原有的实例方法带有一个必须传入的泛型参数,使用不便,且项目可能封装了额外的 config 参数。通过 import axios 后使用 declare module 'axios',可以重新定义 AxiosRequestConfig 和 AxiosInstance 接口,添加自定义字段并简化方法签名。这种方式适用于需要调整第三方库类型行为的场景。
全局模块声明的限制与用途
全局模块类型声明允许在 .d.ts 文件中直接定义函数、接口、命名空间等,但不能包含任何 export 或 import 语句。这使得文件保持为全局脚本,其中的声明自动成为全局可用。文章示例中定义了重载函数 myLib、接口 Person 以及命名空间 myLib,还提到可以直接定义 Window 上的变量和方法。这种方式适合为没有类型定义的库或全局代码提供类型支持。
Q&A
如何在TypeScript中使用declare global定义全局类型?
可以在xxx.d.ts文件中使用declare global语法定义全局类型,必须包含至少一个export语句。
使用declare module如何覆盖第三方包的类型定义?
可以通过import和declare module语法来覆盖第三方包的类型定义,例如axios,添加额外的config参数。
全局模块类型声明有什么限制?
全局模块类型声明可以定义任意类型,但不能包含export和import语句。
在TypeScript中如何定义全局变量和方法?
可以在declare global中定义全局变量、全局类型和全局方法,例如使用let和function关键字。
使用declare global定义全局类型时需要注意什么?
必须确保该文件内部至少包含一个export语句,否则会导致错误。
如何在TypeScript中定义一个全局的Cat类?
可以在declare global中定义Cat类,包含构造函数和方法,例如purr。