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 报警。

相关推荐
DevUI团队2 小时前
从“即兴创作”到“规格先行”,华为云码道(CodeArts)代码智能体持续深耕企业级规范驱动开发能力
前端·人工智能·后端
weixin_431600442 小时前
NestJS 入门(3):Guard 如何挡住未登录请求?
前端·后端·学习·nest.js
avi91113 小时前
[AI教做人]AI平台做2项目;一个3D模型展示,另一个框架多人
javascript·人工智能·ai·3d模型·3d引擎·顶点和法线
kyriewen3 小时前
我用Claude Code两天干完了团队两周的排期——周报发出去那一刻我就后悔了
前端·javascript·ai编程
IT_陈寒3 小时前
JavaScript类型转换把我坑惨了,这破玩意真该早点搞明白
前端·人工智能·后端
用户938515635073 小时前
Type vs Interface:读完这篇就没有面试官能难倒你了
前端·面试·typescript
用户938515635074 小时前
手写一个 LLM Harness 框架:用工程化手段把大模型幻觉踩在脚下
javascript·人工智能·后端
油丶酸萝卜别吃4 小时前
jquery-ajax.js 说明文档
前端·javascript·jquery
windliang4 小时前
Claude Code 源码分析(九):子 Agent 如何分叉、继续与回到父会话
前端·javascript·面试
柒和远方5 小时前
V063: TS 面试必考:interface 与 type 的四大差异,与 LLM Harness 的自动化择优
前端·javascript