Vue 3 结合 TypeScript 定义 Props 的核心是 defineProps 编译器宏,支持泛型接口(类型安全、零运行时开销)、withDefaults(设默认值需工厂函数防共享引用)、运行时配置对象(含 validator 和 required 校验),区别于 Options API 的 this.props 和 prop 选项对象。
Vue 3 结合 TypeScript 定义 Props 的核心是 defineProps 编译器宏,它在 `` 中直接声明、类型安全、零运行时开销。关键不在于“写法多”,而在于选对场景——简单传值用泛型接口,带默认值用 withDefaults,需校验或复杂逻辑则用运行时配置对象。
适合明确结构、强类型约束的场景。直接定义接口,TypeScript 自动推导 props 类型和响应式行为:
interface ButtonProps { size?: 'sm' | 'md' | 'lg'; disabled?: boolean; onClick: () => void }
defineProps<ButtonProps>(),无需 import,编辑器立刻提示属性名和类型size?),必填项缺失会触发 TS 编译报错纯类型接口无法设默认值,必须搭配 withDefaults —— 它返回一个增强版 props,既保类型又保默认逻辑:
interface ListProps { items: string[]; title?: string }
withDefaults(defineProps<ListProps>(), { title: '列表标题', items: () => [] })
() => []),否则会共享引用当需动态校验(如枚举值判断)、或兼容非 TS 环境时,用运行时配置对象更灵活:
defineProps({ status: { type: String as PropType, validator: v => ['success', 'error'].includes(v) } })required: true 显式声明必填,TS 不报错但 Vue 运行时会警告Number、String 可直接写(非字符串字面量),但建议统一用 PropType 提升可读性不用 this.props.xxx,也不用 props: { ... } 选项对象。所有声明都在 `` 顶层:
PropType 辅助(如 Object as PropType<User>),Composition API 直接写 { user: User }
default,Composition API 用 withDefaults 或工厂函数defineProps,体积更小,类型信息只用于开发期校验virtualbox下怎么实现ubuntu20.04开机自动挂载共享文件夹?
ubuntu20.04怎么开启护眼模式? ubuntu夜间模式的设置方法
如何在Ubuntu 20.04上安装Microsoft Edge浏览器
Ubuntu20.10优麒麟触摸手势有哪些? 优麒麟系统新增手势汇总
优麒麟20.04.1发布 更新内容汇总(附下载)
Mermaid Visual Editor 如何同步可视化操作与 Mermaid 源码?