TypeScript 全局声明怎么写
在前端开发里,你肯定碰到过这种情况:用了一个第三方工具函数,但编辑器一直报错“找不到这个名字”;或是自己写了个全局的配置对象,每个组件都要重新定义一遍。这时候,TypeScript的全局声明就能帮你解决这些麻烦,不用绕弯子改源码,就能让代码顺畅运行。
先搞懂:什么是TypeScript的全局声明?
简单说,就是告诉TypeScript:“有个东西,你不用找它的定义,它是全局可用的,我会在别的地方或全局环境里给它赋值”。比如你引入了一个jQuery插件,插件里的$是全局变量,TypeScript默认不认识,这时候加个全局声明,编辑器就不会再标红报错了。

举个生活化的例子:你开了一家奶茶店,固定放了一个“公用糖罐”,所有店员都能随时用这个糖罐。TypeScript的全局声明,就是给这个糖罐贴个标签:“这是公用糖罐,所有店员都能拿糖,不用每次问老板要位置”。
第一种:直接声明全局变量(最常用)
如果是简单的全局变量,不用复杂逻辑,直接用declare var声明就行,格式是declare var 变量名: 类型。
比如你用了一个叫APP_CONFIG的全局配置对象,里面有个apiUrl属性,你可以在项目里新建一个global.d.ts文件(TypeScript默认会自动识别.d.ts结尾的声明文件),然后写:
`typescript
declare var APP_CONFIG: {
apiUrl: string;
timeout: number;
};
`
这样不管哪个组件里写console.log(APP_CONFIG.apiUrl),TypeScript都知道这是合法的,不会报错。
这里要注意:declare只是告诉TypeScript“这个东西存在”,不会真的定义它,你还是要在项目里的某个地方(比如入口文件)给APP_CONFIG赋值,比如:
`typescript
// 入口文件里
window.APP_CONFIG = {
apiUrl: "https://api.xxx.com",
timeout: 5000
};
`
就像你给奶茶店的公用糖罐先装满糖,贴了标签后,店员就能用了。
第二种:声明全局函数
如果是全局函数,用declare function声明,格式和变量类似,要把参数和返回值类型写清楚。
比如你用了一个第三方的工具函数formatDate,用来格式化时间,你可以这样写声明:
`typescript
declare function formatDate(date: Date, format: string): string;
`
用的时候直接写formatDate(new Date(), "yyyy-MM-dd"),TypeScript就知道这个函数的用法是对的,比如传第一个参数必须是日期对象,返回值是字符串。
这就好比奶茶店的“通用制冰函数”,声明里写清楚“要给它一个冰块数量参数,它会返回冰块”,店员用的时候就知道要传多少,不会拿错东西。
第三种:给全局类型加声明
有时候你需要给全局的自定义类型加声明,方便在所有地方用,不用每次导入类型。比如你写了个全局的用户类型UserInfo,可以用declare interface或declare type声明:
`typescript
declare interface UserInfo {
id: number;
name: string;
avatar: string;
}
`
这样在任意组件里,都能直接写const currentUser: UserInfo = { id: 1, name: "张三" },不用单独导入这个接口。
这就像奶茶店的“员工工牌模板”,所有店员都用同一个模板,不用每次重新设计,统一格式方便管理。
避坑提醒:别在`.ts`文件里写声明
很多新手会把全局声明写在普通的.ts文件里,这会导致TypeScript把它当成普通变量,编译后会多出不必要的代码,反而出问题。一定要把声明放在.d.ts结尾的文件里,这类文件是TypeScript专属的声明文件,只会给编辑器提供类型提示,不会编译成JS代码。
另外,如果你用的是Vue、React这类项目,尽量把global.d.ts放在src目录下,TypeScript会自动扫描所有.d.ts文件,不用手动配置路径。
最后再提一句:全局声明不是万能的,能用模块化导入的类型或变量,还是尽量用模块化的方式,减少全局变量的使用,避免后期项目混乱,但碰到第三方工具或全局配置的场景,用全局声明就能快速解决问题。