持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
1. 引言
当我们在 TypeScript 项⽬中查阅 *.d.ts 声明⽂件时,经常会看到declare的身影,你知道它的作用吗?今天我们就来探讨它的用法。
2. 作用
当我们通过script标签引入第三方库JS-SDk的时候,虽然你都是按照开发文档上的写法要求书写的,当时TypeScript编译器在编译阶段还是会提示错误信息,就如如下:
// 微信调起拍照、手机相册照片选择图片接口
wx.chooseImage({
count: 5, // 默认9
sizeType: ["original", "compressed"],
sourceType: ["album", "camera"],
success: function (res) {
var localIds = res.localIds;
},
});
// Error:找不到名称“wx”。ts(2304)
而declare 就是为了解决上述使用第三方JS-SDk 的时候TypeScript无法识别第三方标签的时候,需要如何使用呢?
declare var wx: any 这样就可以了。讲解:declare代表申明;var代表变量(全称variable),wx是第三方库JS-SDk的全局变量名称;而any表示该变量的类型。
3. 含义
declare 就是为了解决第三方sdk引入使用问题,有了它,我们就再也不怕引入第三方库后,TypeScript不识别该标识问题。那也需有同学要问了为什么JSON、Math 或 Object 等这些全局变量可以正常使用呢? 这是因为TypeScript 内部帮我们完成了声明的操作,如在 lib.es5.d.ts 文件有如下申明代码:
// 路径:typescript/lib/lib.es5.d.ts
declare var JSON: JSON;
declare var Math: Math;
declare var Object: ObjectConstructor;
declare可不仅仅可以定义全局变量,它还可以全局全局函数,全局类,全局枚举等(请看例子一) ==注意:在声明全局函数时,我们并不会包含该函数的具体实现。有了声明⽂件之后,TypeScript 编译器 就能识别上⾯的这些全局的 JavaScript 函数了==
在使⽤常⻅ JavaScript 开发的第三⽅库的时候,你可以不⽤⾃⼰定义类型声明⽂件。利⽤TypeScript 官⽹提供的类型声明⽂件搜索功能,也许就能找到质量较⾼的第三⽅库对应的 TypeScript 类型声明⽂件。找到之后,就可以通过 npm 来安装包含所需类型声明⽂件的模块。
声明模块功能:以vite项目中的模块化声明为例,如果当我们不声明这些模块的话TypeScript就会报错找到到模块内容
import css from "./file.css"; // Error:找不到模块“./file.css”或其相应的类型声明。ts(2307)
import logo from "./abao.jpg"; // Error:找不到模块“./abao.jpg”或其相应的类型声明。ts(2307)
路径:packages/vite/client.d.ts(请看例子二)
4. 例子
例子一:(我们以lib.es5.d.ts 文件中的eval、isNaN、encodeURI 和 parseInt 为例子)
declare function eval(x: string): any;
declare function isNaN(number: number): boolean;
declare function encodeURI(uri: string): string;
declare function parseInt(string: string, radix?: number): number;
例子二:
declare module '*.css' {
const css: string
export default css
}
declare module '*.jpg' {
const src: string
export default src
}
declare module '*.ttf' {
const src: string
export default src
}
5. 总结
最后:在声明模块的时候,为了避免每个资源都要声明其对应的模块,TypeScript 2.0 才开始⽀持通配符(*)的形式来 定义模块的名称。此外,TypeScript 还允许你通过 declare module 的语法来扩展已有模块中定义的类型。