前言
写 Vue3 + TS 开发时,谁都踩过这个坑:JS 库正常能用,功能一点毛病没有,编辑器疯狂飘红波浪线报错长这样:
Could not find a declaration file for module 'xxx'
很多人一脸懵逼:我明明 npm install 装好了,为啥还要多装一个包?这不是变相强制捆绑吗?
今天用最接地气的大白话,一次性讲透 @types 到底是个啥
一、大白话
- 你安装的第三方库 = 一台能干活的实体家电(榨汁机、吹风机)
- TypeScript = 一个极度死板、认死理的质检管理员
@types/xxx类型包 = 产品使用说明书
举个栗子🌰
- 家电本身好用,插电就能用(对应:JS 库正常运行)
- 但是没有纸质说明书(对应:纯 JS 库没有类型定义)
- 死板管理员 TS 不认:没说明书,我就警告你、标红你
- 装上说明书
@types→ 管理员闭嘴,不再报错
总结:库负责干活,types 负责哄好 TS。
二、@types 底层到底干了啥?
1. 本体库(以 file-saver、jszip 为例)
- 纯 JS 业务代码
- 负责真实功能:文件下载、前端压缩打包
- 打包上线必须携带,生产依赖
2. @types/xxx 类型声明包
- 里面没有任何业务逻辑
- 只有一堆
.d.ts类型描述文件 - 作用:告诉 TS 这个库有什么方法、传什么参数、返回什么值
极简模拟内部代码:
declare module 'file-saver' {
export function saveAs(blob: Blob, name?: string): void
}
翻译:报告 TS 管理员:这个库有一个 saveAs 方法,传文件二进制和文件名,无返回,请放行!
三、注意:它不会影响线上项目
安装命令:
运行
npm install --save-dev @types/file-saver
--save-dev 含义:
- 仅开发环境使用
- 打包自动剔除,不会打进线上代码
- 零体积、零性能负担、用户完全感知不到
简单说:只在写代码时生效,上线直接隐身。
四、哪些库需要装 types,哪些不需要?
不需要装 @types(自带说明书)
库本身就是 TS 编写,出厂自带类型声明
- vue
- vue-router
- pinia
- axios
- vite
- element-plus / ant-design-vue
必须装 @types(纯 JS 老库无说明书)
原生 JS 开发,无自带类型
- file-saver
- jszip
- jquery
- lodash
- 各类老旧工具库
万能判断口诀
TS 编辑器飘红 → 直接装 @types / 库名百试百灵。
装完瞬间消除所有红色波浪线,代码提示直接拉满。
五、新手最容易踩的误区
误区 1:装了 types 就可以不用装原库
错!types 只是说明书,不能单独干活,本体库必须装。
误区 2:装 types 会增大项目打包体积
错!dev 依赖打包自动忽略,线上完全不存在。
误区 3:所有包都要装 types
错!现代主流 TS 库自带类型,无需重复安装。
六、总结
- 业务库 = 干活工具
@types= TS 专属说明书- 功能运行看本体,代码提示不报错看 types
- 开发装 types,上线自动消失,干净无负担
- 以后见 TS 报找不到声明文件,直接无脑装
@types
从此告别 TS 红波浪线内耗,写代码心情直接舒畅!