在使用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识别不到是因为它的设计原则是“类型必须显式声明或可推导”,而全局注入属性具有隐式性,本质是静态类型检查和动态注入的矛盾。