Vue3项目自动引入ElementPlus的ElMessage、ElMessageBox时无法被ts识别为全局变量的解决办法

222 阅读1分钟

在使用Vue3+Ts+Eslint开发项目时,我按需引入了ElementPlus,但在使用ElMessage和ElMessageBox的时候ts不断提示找不到这两个模块,事实上它们已经在项目中正常使用了,所以自动引入没有问题,那么问题就是ts识别不到它们,所以需要类型声明文件。我在vite.config.ts中添加了两行dts的代码,

export default defineConfig({
  plugins: [
    vue(),
    vueDevTools(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
      dts: 'src/auto-imports.d.ts',
    }),
    Components({
      resolvers: [ElementPlusResolver()],
      dts: 'src/components.d.ts',
    }),
  ],

然后运行npm run dev,此时src目录下生成了auto-imports.d.ts和components.d.ts两个文件,(如果是生成到根目录下需要去tsconfig.json里面配置includes,会带来其他影响,比较麻烦)结果auto-imports.d.ts里的declare global是空的,这也解释了为什么找不到模块ElMessage、ElMessageBox,问题本质就是插件根本没发现这两个变量是全局可用的,因此我手动添加了全局变量

export {}
declare global {
  const ElMessage: (typeof import('element-plus/es'))['ElMessage']
  const ElMessageBox: (typeof import('element-plus/es'))['ElMessageBox']
}

至于为什么会识别不到这两个变量,我还没明白。 2025.9.26更新:TS识别不到是因为它的设计原则是“类型必须显式声明或可推导”,而全局注入属性具有隐式性,本质是静态类型检查和动态注入的矛盾。