【vue3】常见问题04:解决全局引入ElementPlus时类型提示丢失的问题

项目环境:

{
	"pnpm": 8.8.0,
	"node": v18.20.2,
	"vue": "3.4.21",
	"vite": "5.2.6"
}

项目场景:

项目场景:vue3的ts项目全局引入了elementPlus组件,导致没有ts相关的类型提示了

解决方案:

  1. 项目根目录里新建文件夹types, 其中包含global.d.ts文件,内容如下:
/** 全局注册的组件需要在这里声明 TS 类型才能获得 Volar 插件提供的提示 */
declare module "vue" {
   export interface GlobalComponents {
       ElBacktop: (typeof import("element-plus/es"))["ElBacktop"]
       ElBreadcrumb: (typeof import("element-plus/es"))["ElBreadcrumb"]
       ElBreadcrumbItem: (typeof import("element-plus/es"))["ElBreadcrumbItem"]
       ElButton: (typeof import("element-plus/es"))["ElButton"]
       ElCard: (typeof import("element-plus/es"))["ElCard"]
       ElCheckbox: (typeof import("element-plus/es"))["ElCheckbox"]
       ElCheckboxGroup: (typeof import("element-plus/es"))["ElCheckboxGroup"]
       ElCol: (typeof import("element-plus/es"))["ElCol"]
       ElColorPicker: (typeof import("element-plus/es"))["ElColorPicker"]
       ElConfigProvider: (typeof import("element-plus/es"))["ElConfigProvider"]
       ElDatePicker: (typeof import("element-plus/es"))["ElDatePicker"]
       ElDialog: (typeof import("element-plus/es"))["ElDialog"]
       ElDivider: (typeof import("element-plus/es"))["ElDivider"]
       ElDrawer: (typeof import("element-plus/es"))["ElDrawer"]
       ElDropdown: (typeof import("element-plus/es"))["ElDropdown"]
       ElDropdownItem: (typeof import("element-plus/es"))["ElDropdownItem"]
       ElDropdownMenu: (typeof import("element-plus/es"))["ElDropdownMenu"]
       ElForm: (typeof import("element-plus/es"))["ElForm"]
       ElFormItem: (typeof import("element-plus/es"))["ElFormItem"]
       ElIcon: (typeof import("element-plus/es"))["ElIcon"]
       ElImage: (typeof import("element-plus/es"))["ElImage"]
       ElInput: (typeof import("element-plus/es"))["ElInput"]
       ElInputNumber: (typeof import("element-plus/es"))["ElInputNumber"]
       ElLink: (typeof import("element-plus/es"))["ElLink"]
       ElMenu: (typeof import("element-plus/es"))["ElMenu"]
       ElMenuItem: (typeof import("element-plus/es"))["ElMenuItem"]
       ElOption: (typeof import("element-plus/es"))["ElOption"]
       ElPagination: (typeof import("element-plus/es"))["ElPagination"]
       ElPopover: (typeof import("element-plus/es"))["ElPopover"]
       ElRadio: (typeof import("element-plus/es"))["ElRadio"]
       ElRadioGroup: (typeof import("element-plus/es"))["ElRadioGroup"]
       ElRow: (typeof import("element-plus/es"))["ElRow"]
       ElScrollbar: (typeof import("element-plus/es"))["ElScrollbar"]
       ElSelect: (typeof import("element-plus/es"))["ElSelect"]
       ElStatistic: (typeof import("element-plus/es"))["ElStatistic"]
       ElSubMenu: (typeof import("element-plus/es"))["ElSubMenu"]
       ElSwitch: (typeof import("element-plus/es"))["ElSwitch"]
       ElTable: (typeof import("element-plus/es"))["ElTable"]
       ElTableColumn: (typeof import("element-plus/es"))["ElTableColumn"]
       ElTag: (typeof import("element-plus/es"))["ElTag"]
       ElText: (typeof import("element-plus/es"))["ElText"]
       ElTooltip: (typeof import("element-plus/es"))["ElTooltip"]
       ElTreeSelect: (typeof import("element-plus/es"))["ElTreeSelect"]
       ElUpload: (typeof import("element-plus/es"))["ElUpload"]
       RouterLink: (typeof import("vue-router"))["RouterLink"]
       RouterView: (typeof import("vue-router"))["RouterView"]
   }

   export interface ComponentCustomProperties {
       vLoading: (typeof import("element-plus/es"))["ElLoadingDirective"]
   }
}

export {}
  1. 找到tsconfig.json文件,配置include属性如下:
{
	"include": [
        "types/*.d.ts"
    ]
}

总结

  1. GlobalComponents
  • 这个接口定义了在 Vue 组件中可以全局使用的组件,如 Element Plus 中的各种组件 (ElButton, ElInput, ElTable 等等);
  • 这些组件通过 typeof import(“element-plus/es”)[“ElButton”] 这种方式引入,确保了类型安全,即在使用这些组件时,TypeScript 能够进行正确的类型检查
  1. ComponentCustomProperties
  • 这个接口扩展了 Vue 组件实例上的自定义属性,在此处中是 vLoading 指令,该指令来自 Element Plus 的 ElLoadingDirective;
  • 通过这种扩展方式,当你在 Vue 组件中使用 v-loading 指令时,TypeScript 也能进行相应的类型检查
  1. export {} 的作用
  • export {} 的作用就是明确告诉 TypeScript 这个文件是一个模块,而不是一个全局脚本文件,从而避免任何可能的命名冲突问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值