import type 是 TypeScript 3.8 引入的纯类型导入语法,编译时被完全擦除,不生成任何 JS 代码,从而减小 bundle 体积;仅用于类型标注时应优先使用,并配合 tsconfig 中 "importsNotUsedAsValues": "error" 等配置强化效果。

import type 是 TypeScript 3.8 引入的语法,专用于只在类型检查阶段使用、完全不参与运行时执行的导入。它本身不生成任何 JavaScript 代码,因此天然不增加 bundle 体积——这是它最核心的优化价值。
为什么 import type 能减小体积?
普通 import(如 import { utils } from 'lodash')会在编译后生成实际的 require/import 语句,进入最终 bundle;而 import type 会被 TypeScript 编译器彻底擦除,连 import 声明都不保留。
- 编译前:
import type { User } from './types'; const u: User = {...}; - 编译后(ESNext):
const u = {...};—— 没有 import 行,也没有类型痕迹
如何正确识别并改写为 import type?
只要满足“仅用于类型标注、从不作为值使用”,就可安全替换:
- 接口、类型别名、泛型约束:
import type { Props, Option } from './types'; - 类声明中的
implements或extends:class Button implements import type('./types').Clickable { ... }→ 更推荐先import type再使用 - 函数参数/返回值类型:
function render(data: import type('./api').Response)→ 同样建议提前导入
⚠️ 注意:如果同一模块既导出类型又导出值,且你只用了类型部分,仍应改用 import type;但若后续不小心用了该模块的值(比如 utils.xxx()),TypeScript 会报错,提示“值未定义”——这反而是类型安全的体现。
使用 Scrapfly SDK(scrapfly-sdk)在 TypeScript 或 JavaScript 中进行网页抓取,用于用户请求抓取 URL、绕过反爬虫防护、渲染页面等场景。
配合其他配置放大效果
import type 单独有效,但和以下设置协同更佳:
-
"importsNotUsedAsValues": "error"(tsconfig):强制所有仅用于类型的 import 必须写成import type,避免遗漏 -
"removeComments": true+"noUnusedLocals": true:进一步清理无用代码和注释 -
"module": "esnext":确保 Webpack/Vite 能正确识别 ESM 语法,支持 tree shaking
常见误用与排查建议
有时你以为用了 import type,但体积没变小,可能因为:
- 误写了
import { type User } from './types'(这是值导入 + 类型提取语法,仍会保留 import) - 类型文件里混入了值导出(比如
export const STATUS = ...),导致整个模块无法被 tree-shaken - 构建工具未启用 production 模式(tree shaking 和压缩默认关闭)
验证方法:检查编译输出目录(如 dist 或 build)中是否还存在对应 import 行;或用 source-map-explorer 分析打包结果。










