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

相关推荐
卷帘依旧10 小时前
React Hook采用环形链表的原因
前端
lichenyang45310 小时前
从 HarmonyOS AI 聊天模块理解工程化架构:MVVM、Controller、Provider、请求封装与 SSE
前端
卷帘依旧10 小时前
为什么React Hooks不能用在if/for等条件/循环语句中
前端
ZC跨境爬虫11 小时前
跟着 MDN 学CSS day_3:(为一个传记页面添加样式)
前端·javascript·css·ui·音视频·html5
夜雪闻竹11 小时前
sql.js WASM 实战:浏览器里跑 SQLite
javascript·sql·wasm
从文处安11 小时前
「前端何去何从」混乱到有序的状态管理: Reducer 与 Context
前端·react.js
爱喝铁观音的谷力景辉11 小时前
在Cesium中实现带箭头方向路线样式的技术详解
javascript·cesium
Qhappy11 小时前
AI逆向实战:从零还原某航空App的AES加密
javascript·后端
名字都不重要何况昵称11 小时前
Color Pick 2D(多 Canvas 像素拾取)
前端·canvas
安妮的小熊呢12 小时前
CRMEB开源商城系统 & 标准版系统(PHP)开发规范
开发语言·javascript·php