菜单

TypeScript 集成

相关源文件

本页面详细介绍了 Vue.js 核心如何处理 TypeScript 集成,特别是专注于编译器级别的特性,这些特性使得在单文件组件 (SFC) 中进行类型检查成为可能。它解释了 TypeScript 类型是如何被处理、转换为运行时验证器,以及 Vue 特有的 TypeScript 宏(如 defineProps<T>()defineEmits<T>())在底层是如何工作的。

有关运行时类型检查功能(如 PropType)的信息,请参阅 组件 Props

TypeScript 集成概述

Vue 的 TypeScript 集成主要通过 compiler-sfc 包在编译器层面进行处理,该包将 SFC 中的 TypeScript 代码转换为 JavaScript,同时在适当的地方保留类型信息。这包括解析 TypeScript 语法、解析类型定义以及生成等效的运行时代码。

来源

类型解析系统

Vue 的 TypeScript 集成核心是类型解析系统,它分析 TypeScript 类型并将其转换为运行时 JavaScript 代码。

来源

TypeScope 和 Context

类型解析系统操作一个 TypeScope,它跟踪类型的范围及其关系。

ScriptCompileContext 维护当前编译上下文的信息,包括 TypeScript 特定的标志。

来源

在 SFC 中处理 TypeScript

Vue 的编译器通过几个阶段处理 SFC 中的 TypeScript:

来源

编译器解析器插件

编译器使用 Babel 的解析器和 TypeScript 插件来解析 TypeScript 代码。

来源

Vue TypeScript 宏

Vue 提供了用于 TypeScript 集成的特殊编译器宏,允许您使用 TypeScript 类型定义组件选项。

使用 TypeScript 的 defineProps

defineProps<T>() 允许使用 TypeScript 类型定义组件 props。

在处理此宏时,Vue 会:

  1. 提取尖括号内的 TypeScript 类型。
  2. 解析属性及其类型。
  3. 生成等效的运行时验证器。

来源

使用 TypeScript 的 defineEmits

类似地,宏 defineEmits<T>() 使用 TypeScript 定义组件的 emits。

处理流程与 defineProps 类似,从 TypeScript 声明中提取事件名称和类型。

来源

类型推断与运行时转换

Vue 会智能地将 TypeScript 类型转换为 JavaScript 运行时类型。

TypeScript 类型推断的运行时类型
字符串字符串
数字数字
布尔值布尔值
数组数组
功能功能
对象对象
自定义类对象
接口/类型(解析后的结构)
联合类型类型数组
字面量类型精确值

函数 inferRuntimeType 处理此转换。

来源

支持高级 TypeScript 功能

Vue 的 TypeScript 集成支持高级 TypeScript 功能。

实用类型

Vue 支持 TypeScript 的工具类型,例如:

  • Partial<T>
  • Required<T>
  • Pick<T, K>
  • Omit<T, K>
  • Readonly<T>

来源

类型操作

Vue 处理复杂类型操作:

  • 联合类型和交叉类型
  • 映射类型
  • 索引访问类型
  • 模板字面量类型

来源

模板中的 TypeScript 和表达式转换

Vue 通过表达式转换处理模板中的 TypeScript。

函数 transformExpression 处理此过程,为模板表达式中的标识符添加适当的前缀,并处理 TypeScript 特定的结构。

来源

绑定元数据和类型

Vue 使用 BindingTypes 枚举来跟踪组件中绑定的类型。

编译器使用此元数据来:

  1. 确定变量是否需要 .value (对于 ref)。
  2. 根据绑定类型添加适当的前缀。
  3. 优化变量访问模式。

来源

TypeScript 集成注册

Vue 通过一个特殊的模块注册 TypeScript 支持

这允许 Vue 在可用时使用 TypeScript 编译器 API。

来源

实际示例

以下是 TypeScript 集成如何与 Vue 组件端到端协同工作

Vue 编译器通过以下方式处理此问题:

  1. 解析 TypeScript 语法
  2. 解析 User 接口和其他类型
  3. 将 TypeScript 的 prop 和 emit 定义转换为运行时验证器
  4. 为开发者工具保留类型信息

Vue 中支持的 TypeScript 特性表

功能支持备注
基本类型String、Number、Boolean、Object、Array、Function
接口完全支持,包括扩展
类型别名在编译时解析
联合类型在运行时转换为类型数组
交叉类型属性在编译时合并
实用类型Partial、Required、Pick、Omit、Readonly
泛型在模板中有限支持
字面量类型支持字符串、数字、布尔字面量
枚举(Enum)转换为适当的运行时类型
模板字面量类型支持 prop 名称和值
类型缩小⚠️在模板中有限支持
类类型在运行时被视为 Object

来源

通过利用这些 TypeScript 集成功能,Vue 在保持 Vue 所著称的简洁性和响应性的同时,提供了出色的类型安全性。