import type 是 TypeScript 专用于导入类型、不生成运行时代码的语法,可彻底避免仅用于类型检查的导入造成冗余;需配合 importsNotUsedAsValues: "error"、isolatedModules: true 等 tsconfig 配置强化类型擦除。

import type 是 TypeScript 提供的专门用于导入类型、不生成任何运行时代码的语法。它让开发者能明确区分“仅用于类型检查”和“需要运行时值”的导入,从而在模块化开发中真正落实类型擦除原则,实现零运行时损耗。
为什么普通 import 会造成运行时冗余?
当使用常规 import 导入一个仅用于类型注解的接口或类型别名时,TypeScript 默认会保留该 import 语句(除非启用 importsNotUsedAsValues: "error" 或 "preserve" 配合 isolatedModules),导致编译后 JS 中出现无意义的 import 或 require 调用——即使目标模块里只有 interface 或 type。
- 例如:
import { User } from './types';,而types.ts只导出interface User { ... } - 编译后可能生成
import { User } from './types.js';,但User在运行时根本不存在,这个 import 纯属冗余 - 在打包阶段可能被 Tree-shaking 清理,但增加了构建分析负担,且对 CJS/UMD 等环境不友好
import type 的正确用法与效果
用 import type 显式声明:这个导入只服务于类型系统,编译器可安全擦除,不参与任何运行时逻辑。
使用 Scrapfly SDK(scrapfly-sdk)在 TypeScript 或 JavaScript 中进行网页抓取,用于用户请求抓取 URL、绕过反爬虫防护、渲染页面等场景。
- 语法简洁:
import type { User, ApiResponse } from './types'; - 也可混合使用:
import type { User } from './types'; import { apiClient } from './client'; - 支持默认导入:
import type React from 'react';(注意:若库未提供typesVersions或exports.types,需确保类型定义可用) - 编译后完全消失:无论目标模块是
interface、type还是enum(仅类型部分),该 import 不会在 JS 输出中留下任何痕迹
配合 tsconfig 配置强化擦除保障
单靠 import type 不够,还需配置编译选项堵住漏网之鱼:
-
"importsNotUsedAsValues": "error":强制要求所有仅用于类型的导入必须写成import type,否则报错 -
"isolatedModules": true:确保每个文件可独立编译,避免因跨文件类型依赖导致意外保留 import -
"verbatimModuleSyntax": true(TS 5.0+):更严格分离值导入与类型导入,禁止自动提升import为import type - 禁用
preserveValueImports(除非有特殊装饰器元数据需求),防止类型导入被错误保留
常见误用场景与规避建议
实际开发中容易踩坑的地方:
-
不要对运行时值使用 import type:比如
import type { useState } from 'react'❌ ——useState是函数,必须用普通import -
避免在类型导入中混入值导出:如果
./types同时导出interface User和const USER_ROLES = [...],应拆分文件,或改用import type * as Types from './types'+ 单独import { USER_ROLES } -
第三方库类型需确认导出方式:有些库(如早期版本的 Lodash)类型未分离,此时
import type可能失效,建议优先选用提供types字段或 ESM 类型包的库 -
动态 import() 不支持 type 修饰:
const mod = await import('./module');无法加type,此时应确保模块本身导出结构清晰,或用typeof mod获取类型

















