@types/xxx到底是个啥

4 阅读3分钟

前言

写 Vue3 + TS 开发时,谁都踩过这个坑:JS 库正常能用,功能一点毛病没有,编辑器疯狂飘红波浪线报错长这样:

Could not find a declaration file for module 'xxx'

很多人一脸懵逼:我明明 npm install 装好了,为啥还要多装一个包?这不是变相强制捆绑吗?

今天用最接地气的大白话,一次性讲透 @types 到底是个啥

一、大白话

  • 你安装的第三方库 = 一台能干活的实体家电(榨汁机、吹风机)
  • TypeScript = 一个极度死板、认死理的质检管理员
  • @types/xxx 类型包 = 产品使用说明书

举个栗子🌰

  1. 家电本身好用,插电就能用(对应:JS 库正常运行)
  2. 但是没有纸质说明书(对应:纯 JS 库没有类型定义
  3. 死板管理员 TS 不认:没说明书,我就警告你、标红你
  4. 装上说明书 @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 库自带类型,无需重复安装。

六、总结

  1. 业务库 = 干活工具
  2. @types = TS 专属说明书
  3. 功能运行看本体,代码提示不报错看 types
  4. 开发装 types,上线自动消失,干净无负担
  5. 以后见 TS 报找不到声明文件,直接无脑装 @types

从此告别 TS 红波浪线内耗,写代码心情直接舒畅!