当前位置: 首页 > news >正文

Vue3 + TypeScript中defineEmits 类型定义解析

TypeScript 中 Vue 3 的 defineEmits 函数的类型定义,用于声明组件可以触发的事件。以下是分步解释:

1. 泛型定义

ts

<"closeDialog" | "getApplySampleAndItemX">
  • 作用:定义允许的事件名称集合,即组件只能触发 closeDialog 或 getApplySampleAndItemX 两个事件。

  • 说明:这是一个泛型参数,限定事件名必须为这两个字符串字面量类型之一。


2. 函数参数

ts

(emitOptions: ("closeDialog" | "getApplySampleAndItemX")[])
  • 作用:接受一个事件名数组作为参数(如 ['closeDialog'])。

  • 说明emitOptions 是事件名的数组,用于运行时声明组件支持的事件。


3. 返回值函数

ts

(event: "closeDialog" | "getApplySampleAndItemX", ...args: any[]) => void
  • 作用:返回一个 emit 函数,用于触发事件。

    • event:要触发的事件名,必须是泛型定义中的事件。

    • ...args:事件的参数(类型宽松,允许任意参数)。

  • 说明:调用 emit('closeDialog') 或 emit('getApplySampleAndItemX', arg1, arg2) 时,参数类型不会被严格约束(因 args 是 any[])。


4. 重载(+2 overloads)

  • 作用:提供多种类型定义,以适应不同使用场景。

    • 场景一:运行时声明(传入事件名数组,参数宽松)。

      ts

      defineEmits(['closeDialog'])
    • 场景二:类型声明(通过接口定义事件参数类型,类型严格)。

      ts

      defineEmits<{(e: 'closeDialog'): void;(e: 'getApplySampleAndItemX', sample: string, item: number): void;
      }>()
    • 场景三:可能其他配置方式(如混合使用或额外选项)。


总结

  • 用途:在 Vue 组件中定义可触发的事件。

  • 两种用法

    1. 运行时声明:传入字符串数组,参数类型宽松。

    2. 类型声明:通过接口定义事件及参数类型,实现严格类型检查。

  • 代码中的类型:对应运行时声明,允许任意参数(any[]),而重载覆盖了类型声明等场景,提供更灵活的类型支持。

示例

typescript

// 运行时声明(参数宽松)
const emit = defineEmits(['closeDialog', 'getApplySampleAndItemX']);
emit('closeDialog'); // 正确
emit('getApplySampleAndItemX', 123, 'abc'); // 参数类型不检查// 类型声明(参数严格)
const emitStrict = defineEmits<{(e: 'closeDialog'): void;(e: 'getApplySampleAndItemX', sample: string, item: number): void;
}>();
emitStrict('getApplySampleAndItemX', 'sample', 123); // 参数类型匹配
emitStrict('getApplySampleAndItemX', 123, 'sample'); // 错误:参数类型不匹配

通过重载,defineEmits 能同时支持灵活和严格的类型检查,适应不同开发需求。

相关文章:

  • LeetCode 5:最长回文子串
  • 【java实现+4种变体完整例子】排序算法中【冒泡排序】的详细解析,包含基础实现、常见变体的完整代码示例,以及各变体的对比表格
  • AI写代码工具分享:Cursor 高效使用攻略与实战秘籍
  • 【图片识别分类】如何快速识别照片中的水印文字,对图片进行关键字分类,快速整理水印相机拍摄图片,基于WPF和腾讯OCR的技术实现
  • QML中的3D功能--自定义着色器开发
  • 实现Azure Synapse Analytics安全地请求企业内部API返回数据
  • Flink框架十大应用场景
  • 嵌入式软件--stm32 DAY 2
  • 为什么浮点数会搞出Infinity和NAN两种类型?浮点数的底层原理?IEEE 754标准揭秘?
  • VSCode安装与环境配置(Mac环境)
  • 【计算机视觉】CV实战项目- Face-and-Emotion-Recognition 人脸情绪识别
  • sqlilabs-Less11 POST注入
  • 一个项目中多个Composer的使用方法
  • LibModbus 主从机通信应用实例
  • 【今日三题】判断是不是平衡二叉树(递归) / 最大子矩阵(二维前缀和) / 小葱的01串(滑动窗口)
  • 【技术派后端篇】 Redis 实现用户活跃度排行榜
  • 数据库备份-docker配置主从数据库
  • IntelliJ IDEA右键快捷方式设置方法
  • Sentinel源码—5.FlowSlot借鉴Guava的限流算法二
  • uniApp小程序保存定制二维码到本地(V3)
  • “30小时不够”,泽连斯基建议延长停火至30天
  • 两大跨国巨头称霸GLP-1市场,国产减肥药的机会在哪?
  • 日薪100元散发“引流小卡片”,上海浦东警方抓获2名违法人员
  • 肯尼亚总统鲁托将访华,外交部:中肯两国元首将举行会谈
  • 真实体验不同价值观和生活方式,小鹿、仁科都要上这档节目
  • 国台办:岛内半导体产业被“卖台专业户”赖清德拱手相送是迟早的事