vue props严格模式通过ts编译期类型约束与运行时validator校验协同实现,需用泛型定义props、required标识必填、工厂函数提供引用默认值,并用validator校验业务规则。

Vue 中的 Props 严格模式不是开关式配置,而是通过编译期类型约束 + 运行时校验逻辑协同实现的。它不依赖某个“strict: true”标志,而体现在你如何定义 props:是否用 TypeScript 精确描述结构、是否补全 required/default/validator、是否规避引用共享和解构陷阱。
用 TypeScript 接口 + PropType 明确复杂类型
仅写 type: Object 或 type: Array 几乎等于没校验。必须结合 TypeScript 类型系统,在编译阶段就锁定字段名、嵌套结构和可选性:
- 组合式 API 中推荐使用泛型:
defineProps() - 若需运行时保留(如兼容非 TS 环境),用
Object as PropType<user></user>,其中User是接口 - 枚举值优先用字面量联合类型:
status: 'idle' | 'loading' | 'success',IDE 可自动提示,TS 编译期拦截非法字符串
必填项必须显式声明 required,不可靠默认值兜底
基础类型(String/Number)即使写了 default,传入 null 或 undefined 仍能通过类型检查,但后续调用 .trim() 或 ?.id 会直接报错:
- 关键字段一律加
required: true,例如:id: { type: Number, required: true } -
required和default不能共存——逻辑上冲突,Vue 也会警告 - 布尔型 props 不要依赖 “未传即 false”,必须明确写
default: false或required: true
validator 是业务语义的最终防线
TypeScript 只管“长得像不像”,validator 才管“合不合规矩”。它在开发环境同步执行,失败时输出警告,不中断渲染,但能提前暴露问题:
- 枚举限制:
theme: { type: String, validator: v => ['light', 'dark', 'auto'].includes(v) } - 数值范围:
delay: { type: Number, validator: v => Number.isInteger(v) && v >= 0 && v - 对象必含字段:
apiConfig: { type: Object as PropType<apiconfig>, validator: v => v && 'baseUrl' in v && typeof v.baseUrl === 'string' }</apiconfig> - 开发时可在 validator 内加
console.warn提示具体违规原因,比单纯返回false更利于调试
引用类型默认值必须用工厂函数
数组或对象写成字面量默认值(如 default: [])会导致所有组件实例共享同一引用,一处修改影响全局:
- ✅ 正确:
items: { type: Array as PropType<string>, default: () => [] }</string> - ✅ 正确:
filters: { type: Object as PropType, default: () => ({ status: 'all' }) } - ❌ 错误:
default: { status: 'all' }—— 多个实例共用该对象 - 函数类型默认值也需是函数:
onSubmit: { type: Function as PropType void>, default: () => {} }










