Vue3:泛型类型声明 vs 运行时选项声明 语法对比

Vue 3 提供了两种 props 声明方式:泛型类型声明和运行时选项声明。


泛型类型声明(defineProps<{prop:Type}>())在编译时进行类型检查,完全支持 TypeScript,适合新项目和追求类型安全的场景。


运行时选项声明(defineProps({prop:{type:...}}))支持运行时验证、默认值和自定义验证器,但需要 PropType 辅助类型。


两种语法不能混用。


推荐优先使用泛型类型声明以获得更好的开发体验和类型安全,仅在需要运行时特性时使用选项声明。


实际应用中需根据项目需求选择合适的声明方式。


泛型类型声明 vs 运行时选项声明语法对比

特性泛型类型声明运行时选项声明
语法defineProps<{ prop: Type }>()defineProps({ prop: { type: ..., required: ... } })
TypeScript支持✅ 完全支持类型推断✅ 需要结合PropType辅助类型
Vue版本要求Vue 3.3+ (推荐)Vue 3.0+
类型检查时机编译时(开发阶段)运行时(实际执行时)
代码示例typescript<br>defineProps<{<br> list: ColumnProps[]<br>}>()typescript<br>defineProps({<br> list: {<br> type: Array as PropType<ColumnProps[]>,<br> required: true<br> }<br>})
默认值设置需配合withDefaults()直接在选项中设置default
必填/可选控制通过?修饰符
list?: Type(可选)
list: Type(必填)
通过required选项
类型导入直接使用TypeScript类型需要导入PropType
验证函数不支持支持validator选项
复杂类型直接使用TypeScript类型需要PropType包装
IDE智能提示✅ 优秀✅ 良好
与Composition API集成✅ 无缝✅ 良好
编译产物大小较小(无运行时类型检查代码)较大(包含运行时检查)
推荐场景1. 新项目开发
2. 纯TypeScript项目
3. 追求最佳类型安全
1. 需要运行时验证
2. 需要默认值
3. 需要自定义验证器
混合使用❌ 不能与运行时选项混用✅ 可与泛型类型配合withDefaults()

实际应用建议:

使用泛型类型声明(现代推荐)

// 简洁、类型安全 const props = defineProps<{ list: ColumnProps[] // 必填 title?: string // 可选 }>(); // 有默认值时 const props = withDefaults(defineProps<{ list: ColumnProps[] size?: 'small' | 'medium' | 'large' }>(), { size: 'medium' });

使用运行时选项(需要运行时特性)

import type { PropType } from 'vue'; const props = defineProps({ list: { type: Array as PropType<ColumnProps[]>, required: true, default: () => [], validator: (value) => value.length <= 10 // 额外验证 } });

选择原则

  • 新项目优先使用泛型类型声明

  • 需要validator或复杂运行时逻辑时使用运行时选项

  • 避免两种语法混用在同一defineProps调用中


代码分析:易错点


<script setup lang='ts'> import { computed, type PropType } from 'vue'; //“PropType”是一种类型,必须在启用 "verbatimModuleSyntax" 时使用仅类型导入进行导入。 //这个错误是因为 TypeScript 配置中的 verbatimModuleSyntax 选项要求对类型和值导入进行区分。当你使用 PropType 时,它是一个类型,需要按照特定的方式导入。 //使用 type PropType:在导入时添加 type 关键字,表明这是一个类型导入 //使用 withDefaults:为了处理可选属性的默认值问题 //定义专栏属性的接口 interface ColumnProps { id: number; title: string; avatar?: string;// 可选属性 description: string; } //错误写法1 // const props = defineProps<{ // list:{ // type: Array<ColumnProps>, // required: true, // } // }>(); //错误写法2 // const props = defineProps<{ // list:{ // type: PropType<ColumnProps[]>, // required: true, // } // }>(); //正确写法 const props = defineProps<{ list:Array<ColumnProps>; }>(); //处理数据,如果没有头像,使用默认头像 //使用computed属性处理数据 import defaultAvatar from '@/assets/default-avatar.png' // 静态导入 const columnList = computed(() => { return props.list.map(column => { if (!column.avatar) { // 使用 require 方法引入本地图片 //ReferenceError: require is not defined at ColumnList.vue //这个问题是因为在 Vue 3 + Vite 环境中使用了 require 函数,而 Vite 默认不支持 CommonJS 的 require 语法。需要修改 ColumnList.vue 中的相关代码。 //column.avatar = require('@/assets/default-avatar.png'); column.avatar = defaultAvatar; } return column; }); }); // 导出 ColumnProps 类型以供外部使用 export type { ColumnProps }; </script>

主要问题

类型声明语法混合错误:在<script setup>中使用defineProps时,不能混用类型声明和运行时选项


三种写法的正确形式:

正确写法1:纯类型声明(使用泛型)

// ✅ 正确 - 纯类型声明 const props = defineProps<{ list: ColumnProps[] }>();

正确写法2:运行时声明(使用对象语法)

// ✅ 正确 - 运行时声明 import type { PropType } from 'vue'; const props = defineProps({ list: { type: Array as PropType<ColumnProps[]>, required: true } });

正确写法3:混合声明(Vue 3.3+)

// ✅ 正确 - 混合声明(TypeScript + 运行时选项) import type { PropType } from 'vue'; const props = withDefaults(defineProps<{ list: ColumnProps[] }>(), { // 这里可以设置默认值 // list: () => [] }); // 或者如果需要 required,直接在类型中标注 const props = defineProps<{ list: ColumnProps[] // 默认是必填的 }>();

建议的优化写法:

根据你的需求,如果要确保list是必填的,推荐使用:

// 方案1:简洁的纯类型声明(推荐) const props = defineProps<{ list: ColumnProps[] // TypeScript中默认可选,但这里表示需要传入 }>(); // 方案2:如果需要明确的运行时验证 import type { PropType } from 'vue'; const props = defineProps({ list: { type: Array as PropType<ColumnProps[]>, required: true, default: () => [] // 如果需要默认值 } });

关键点:在<script setup>中,不能同时使用泛型类型声明和运行时选项声明语法,需要选择其中一种方式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1160297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《创业之路》-857- 商业模式案例分析:阿里、百度、腾讯、字节、滴滴、美团、京东、拼多多 全面对比

商业模式案例分析&#xff1a;阿里、百度、腾讯、字节、滴滴、美团、京东、拼多多 全面对比在中国数字经济的版图中&#xff0c;阿里巴巴、百度、腾讯、字节跳动、滴滴出行、美团、京东、拼多多是八家最具代表性的科技企业。它们虽同属“互联网”时代产物&#xff0c;但因创始基…

交通仿真软件:SUMO_(15).高级仿真技术:微观与宏观仿真结合

高级仿真技术&#xff1a;微观与宏观仿真结合 在交通仿真领域&#xff0c;微观仿真和宏观仿真各自具有不同的优势和应用场景。微观仿真可以详细模拟每个车辆的行为&#xff0c;而宏观仿真则关注于交通流的整体特性。为了充分利用这两种仿真的优点&#xff0c;许多交通仿真软件提…

洛谷 T478345:循环数组 ← 单调队列 + 破环成链

【题目来源】 https://www.luogu.com.cn/problem/T478345 【题目描述】 给你一个循环的数组 A[1], A[2], A[3], ...., A[n]。循环的数组意思是 A[1] 的左边是 A[n]&#xff0c;A[n] 的右边是 A[1]&#xff0c;也就是可以理解为他们连成了一个环。 现在你的任务是找到一个字串&…

基于小程序的篮球场馆预订系统-计算机毕业设计源码+LW文档

摘 要 随着国家的迅猛发展和互联网技术的持续飞跃&#xff0c;现代生活节奏显著加快。为了更有效地管理时间、提升个人及工作效率&#xff0c;大众愈发倾向于借助互联网平台处理各类日常事务&#xff0c;这一趋势直接催生了微信小程序的蓬勃兴起。在此背景下&#xff0c;人们对…

探索光伏发电三相并网技术:从原理到实现

光伏发电三相并网 光伏加&#xff0b;Boost&#xff0b;三相并网逆变器 PLL锁相环 MPPT最大功率点跟踪控制(扰动观察法) dq解耦控制&#xff0c; 电流内环电压外环的并网控制策略 电压外环控制直流母线电压稳住750V THD低至0.44%&#xff01;并网电流波形漂亮&#xff01;在如今…

C#上位机源代码,采集西门子200smart温度数据并显示波形曲线,温度到达上限值或下限值进行...

C#上位机源代码&#xff0c;采集西门子200smart温度数据并显示波形曲线&#xff0c;温度到达上限值或下限值进行报警提示。 采集的数据每天生成一个excel报表&#xff0c;全套源代码系统概述 本系统是一个基于C#开发的西门子PLC温度数据采集与监控平台&#xff0c;专门用于实时…

永磁同步电机(PMSM)匝间短路故障Simulink仿真探索

永磁同步电机&#xff08;pmsm&#xff09;匝间短路故障simulink仿真。 提供文档参考说明。在电机领域&#xff0c;永磁同步电机&#xff08;PMSM&#xff09;以其高效、节能等诸多优点&#xff0c;被广泛应用于工业驱动、电动汽车等多个场景。然而&#xff0c;电机运行过程中&…

【码力全开特辑直播预告】1月15日晚7点,AscendNPU IR架构开源解读

【昇腾CANN】视频号、B站、昇腾社区多平台直播 &#xff0c;弹幕答题互动赢取惊喜定制礼&#xff01;通过Ascend C算子开发能力认证&#xff08;中级&#xff09;&#xff0c;完成社区任务、分享学习成果、优秀嘉宾分享&#xff0c;可赢取华为三折叠、笔记本电脑等超级大奖&…

交通仿真软件:SUMO_(23).交通仿真中的行人与自行车模型

交通仿真中的行人与自行车模型 在交通仿真软件 SUMO 中&#xff0c;行人和自行车模型是重要的组成部分&#xff0c;用于模拟城市交通中非机动交通参与者的行为。这些模型可以帮助研究人员和工程师更准确地评估交通流量、安全性和城市规划的有效性。本节将详细介绍如何在 SUMO 中…

Tailwind CSS vs Bootstrap vs ElementUI(ElementPlus) 全面对比表

本文对TailwindCSS、Bootstrap和ElementUI三大前端框架进行全面对比。从基本信息、设计哲学、技术特性到开发体验等维度展开分析&#xff1a;TailwindCSS以Utility-First理念提供极致定制性&#xff1b;Bootstrap凭借预制组件实现快速开发&#xff1b;ElementUI作为Vue组件库提…

下一代CMO的核心课题:通过GEO优化,管理AI口中的“品牌第二身份”

生成式AI的普及正在引发一场静默但深刻的变革&#xff1a;搜索引擎的“答案页”正被AI助手的“对话流”所取代。当用户习惯于向ChatGPT、Copilot等工具直接提问并获取整合答案时&#xff0c;传统的“关键词排名-链接点击”营销逻辑便出现了根本性断裂。在这一断裂处兴起的新领域…

西门子PLC实现冷热水恒压供水系统开发之旅

西门子Siemens PLc程序&#xff0c;TiA博途V15.1 V16 V17版冷热水恒压供水系统&#xff0c;变频器控制&#xff0c;模拟量输入和输出处理&#xff0c;温度控制&#xff0c;流量计算控制&#xff0c;配方控制&#xff0c;LAd和ScL语言 在自动化控制领域&#xff0c;西门子的PLC配…

53、UART 串口通信

UART 串口通信&#xff08;51单片机Modbus协议&#xff09; 一、UART 核心概念与特性 UART&#xff08;Universal Asynchronous Receiver Transmitter&#xff09; 通用异步收发器&#xff0c;是MCU与外部设备异步通信的硬件接口模块&#xff0c;核心特性如下&#xff1a; 异步…

【毕业设计】基于深度学习的是否有污渍识别基于python-cnn深度学习的是否有污渍识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

信创超融合怎么选?透过IDC 2025报告看主流国产超融合解决方案

近日&#xff0c;IDC 发布《中国超融合市场跟踪报告&#xff0c;2025 年前三季度》&#xff0c;详解中国区超融合发展趋势、市场份额规模以及厂商占比。在报告中&#xff0c;IDC 从软件市场、全栈市场以及整体市场三个维度对国内的主流超融合厂商市场份额进行了梳理。超融合软件…

全阶滑模无位置传感器控制仿真模型,有基本的反正切的,有锁相环的,有基本的开关函数,有饱和函数...

全阶滑模无位置传感器控制仿真模型&#xff0c;有基本的反正切的&#xff0c;有锁相环的&#xff0c;有基本的开关函数&#xff0c;有饱和函数&#xff0c;sigmod函数&#xff0c;以及幂函数多种滑模。 还有全阶滑模观测器仿真&#xff0c;相比传统滑模观测器消除了额外的低通滤…

DevOps与SRE概念理解

DevOps与SRE概念理解 DevOps 和 SRE&#xff08;Site Reliability Engineering&#xff09;是现代软件工程中保障高效交付与系统稳定性的两大核心方法论&#xff0c;二者目标高度一致但侧重点不同&#xff0c;在生产环境中常常协同落地。 一、基础认知&#xff1a;什么是DevOps…

乐迪信息:AI视频分析技术如何定义和检测船舶逆行?

逆行不仅严重威胁着水上交通安全&#xff0c;还可能导致严重的交通事故。因此&#xff0c;如何有效遏制船舶逆行行为&#xff0c;成为当前水上交通管理领域有待解决的问题。一&#xff1a;船舶AI逆行检测系统的工作原理船舶AI逆行检测系统是一种基于人工智能技术的智能监控系统…

项目的逻辑和流程

项目的逻辑和流程 在互联网项目的推进过程中&#xff0c;清晰的逻辑框架和规范的执行流程是保障项目稳定落地的核心。无论是小型工具开发还是大型系统搭建&#xff0c;都离不开“从无到有、从测试到上线”的全流程管控。 一、项目核心逻辑阶段核心目标关键动作参与角色交付成果…

深度学习计算机毕设之基于卷神经网络的是否有污渍识别基于python-cnn深度学习的是否有污渍识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…