Vue 3 + TypeScript 最推荐在 中直接写类型声明,支持 ref/reactive 显式泛型、defineProps/withDefaults 强类型 Props、defineEmits 类型化事件、computed 和函数显式标注。

直接在 <script setup lang="ts"></script> 中写类型声明,是 Vue 3 + TypeScript 最自然、最推荐的方式。它不依赖运行时校验,编辑器能实时提示,类型错误在编码阶段就暴露。
定义响应式数据的类型
用 ref 和 reactive 时,TypeScript 默认会根据初始值推断类型,但复杂场景需显式标注:
-
基础类型用泛型:比如
const count = ref<number>(0)</number>或const name = ref<string>('')</string> -
对象类型建议先定义接口:
interface User {<br> id: number;<br> name: string;<br> email?: string;<br>}<br>const user = ref<User>({ id: 1, name: '张三' }); -
可为空或联合类型要写全:如
const timer = ref<number null>(null)</number>,避免后续赋值时报错
定义组件 Props 的类型
使用 defineProps 配合类型参数,是最简洁可靠的强类型方式:
将静态 Vue 页面(index.vue)改造为动态页面(Custom.vue);稿源仅限 index.vue、其引用的 CSS 与资源路径,禁止参考仓库内其他文件。Invoke when user wants to transform a static Vue page into a dynamic data-driven page with Element UI components.
-
直接传入类型字面量:
const props = defineProps() -
用 interface 提升可读性和复用性:
interface Props {<br> modelValue: string;<br> size?: 'small' | 'large';<br> onChange?: (val: string) => void;<br>}<br>const props = defineProps<Props>(); -
带默认值时用
withDefaults,类型仍受保护:const props = withDefaults(defineProps<Props>(), {<br> size: 'small',<br> modelValue: ''<br>});
定义 Emits 的事件类型
让父组件调用 $emit 时也有类型提示和校验:
立即学习“前端免费学习笔记(深入)”;
-
事件名 + 参数类型数组:
const emit = defineEmits(); -
更清晰的写法(推荐):用类型别名或接口封装:
type Emits = {<br> 'update:modelValue': [value: string];<br> change: [id: number];<br> error: [msg: string];<br>};<br>const emit = defineEmits<Emits>();
计算属性与函数的类型控制
多数情况可自动推导,但关键逻辑建议显式标注:
-
computed 返回值类型:如
const fullName = computed<string>(() => props.firstName + ' ' + props.lastName);</string> -
普通函数标注参数和返回值:
const formatTime = (timestamp: number): string => {<br> return new Date(timestamp).toLocaleString();<br>}; - 方法中访问 this 或 props 时,无需额外声明 ——
props和emit本身已是强类型变量

















