Vue3 props: `required: true` 与 vant 的`makeRequiredProp`

为什么直接加 required: true会报错,用了makeRequiredProp就不会了?

makeRequiredProp 源码:

typescript 复制代码
export const makeRequiredProp = <T>(type: T) => ({
  type,
  required: true as const,
});
  • 原因

    • 写成 { type: [Number, String], required: true } 时,TS 会把 type 推断为 (NumberConstructor | StringConstructor)[],在 Vue 的 ExtractPropTypes 推断里,常见情形会丢失"必填"约束,结果在组件里 props.xxx 仍被认为可能是 undefined。
    • makeRequiredProp 把 type 明确成预期的 PropType,并且 required 是字面量 true(true as const);这样 ExtractPropTypes 才会把该 prop 标记为非可选,消除 "possibly undefined"。
  • 简洁可行的两种写法

    • 用 helper(推荐):

      ts 复制代码
      import { makeRequiredProp, numericProp } from '../utils/props'
      
      optionHeight: makeRequiredProp(Number),
      swipeDuration: makeRequiredProp(numericProp),
      fields: makeRequiredProp(Object as PropType<Required<PickerFieldNames>>),
    • 或者手工写到位(注意 as const 与 PropType):

      ts 复制代码
      optionHeight: { type: Number as PropType<number>, required: true as const },
      swipeDuration: { type: numericProp as PropType<number | string>, required: true as const },
      fields: { type: Object as PropType<Required<PickerFieldNames>>, required: true as const },

这两种方式都能让 TS 正确认定为必填,避免 props.xxx 的 undefined 报警。

相关推荐
高级程序源5 小时前
springboot社区旧物回收管理系统25381-计算机课程设计、毕业设计
vue.js·spring boot·python·django·课程设计
高级程序源5 小时前
springboot大学生体测系统72170-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·django·课程设计
谢亮_vipxieliang5 小时前
JavaScript this 指向完全指南:调用位置决定一切
开发语言·javascript·ecmascript
Eiceblue5 小时前
使用 Python 实现 Excel 行列转置(保留单元格样式)
前端·python·excel
WeiXin_DZbishe5 小时前
基于Node.js的马拉松赛事管理系统的设计与实现-计算机毕设 附源码【课程设计】90211
java·javascript·vue.js·python·php·课程设计
西西学代码6 小时前
像素和颜色之间的转换(Flutter)
前端·javascript·flutter
茶底世界之下6 小时前
羽毛颜色已经很鲜艳,还要继续加色吗?用 Awaking 试一次减饱和
前端·ios·运营
风早爽太6 小时前
Mac 搭建 Vue 开发环境
前端·vue.js
Lank_M6 小时前
Word图片裁剪转HTML失效,转换器各漏读了哪一层
前端
高级程序源6 小时前
springboot校园外卖平台13676-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·tomcat·maven·课程设计