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
    • makeRequiredProptype 明确成预期的 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 报警。

相关推荐
+VX:Fegn08954 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
前端·数据库·vue.js·spring boot·课程设计
半个落月4 小时前
LangChain.js Agent Memory 实战(下):用 Milvus 构建可检索的长期记忆
javascript·langchain
半个落月4 小时前
LangChain.js Agent Memory 实战(上):从内存对话、文件持久化到截断与摘要
javascript·langchain
Nicander5 小时前
我给 Excalidraw 做了一个本地工作区:DrawSpace
前端·开源
linux_cfan7 小时前
17 · 引擎适配器全景:HLS/DASH/Vimeo/Mux/Cast
前端·javascript·音视频
计算机魔术师7 小时前
烧掉2780亿美元还不够?OpenAI的资本豪赌让人头皮发麻
前端
IT_陈寒8 小时前
Java线程池用错参数,我的服务居然悄悄崩溃了
前端·人工智能·后端
卡布鲁9 小时前
React useMemo 与 useCallback 完全指南:原理、场景与避坑
前端·react.js
碳基修炼9 小时前
排查记:本地 devServer 是 http,浏览器却把 302 重定向升级成了 https
前端·http
步行cgn9 小时前
Spring p 命名空间注入详解
java·前端·spring