You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue3 Composition API自定义TS插件:WebStorm类型提示异常求助

Vue3 + TypeScript自定义i18n插件的IDE类型提示问题

我在WebStorm中使用Vue3 Composition API开发带TypeScript类型增强的自定义i18n插件时遇到问题:功能在运行时正常,但<template>标签中调用$translation会出现警告,<script setup>标签中直接调用该方法则报错。以下是项目配置与代码详情:


项目配置与代码详情

1. tsconfig.config.json配置

{
  "extends": "@vue/tsconfig/tsconfig.node.json",
  "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "playwright.config.*", "src/i18n.d.ts"],
  "compilerOptions": {
    "composite": true,
    "types": ["node"]
  }
}

2. package.json配置

{
  "name": "my-app",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "dev": "vite",
    "build": "run-p type-check build-only",
    "preview": "vite preview",
    "build-only": "vite build",
    "type-check": "vue-tsc --noEmit",
    "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore"
  },
  "dependencies": {
    "pinia": "^2.0.28",
    "vue": "^3.2.45",
    "vue-router": "^4.1.6"
  },
  "devDependencies": {
    "@rushstack/eslint-patch": "^1.1.4",
    "@types/node": "^18.11.12",
    "@vitejs/plugin-vue": "^4.0.0",
    "@vue/eslint-config-typescript": "^11.0.0",
    "@vue/tsconfig": "^0.1.3",
    "eslint": "^8.22.0",
    "eslint-plugin-vue": "^9.3.0",
    "npm-run-all": "^4.1.5",
    "typescript": "~4.7.4",
    "vite": "^4.0.0",
    "vite-plugin-checker": "^0.5.5",
    "vue-tsc": "^1.0.12"
  }
}

3. 项目结构

项目结构截图

4. 自定义i18n插件代码(src/plugins/i18n.ts)

import type {App} from "vue";

export default {
    install(app: App, options: any) {
        app.config.globalProperties.$translation = (key: string) =>  {
                const keys = key.split('.');
                return keys.reduce((o: any, i) => {
                    if (o) return o[i]
                }, options);
            }
        }
    }

5. 类型增强文件(src/i18n.d.ts)

export{}

declare module 'vue' {
    interface ComponentCustomProperties {
        $translation: (key: string) => string;
    }
}

6. main.ts中的插件注册

import { createApp } from 'vue'
import { createPinia } from 'pinia'

import App from './App.vue'
import router from './router'
import PrimeVue from 'primevue/config';

import 'primevue/resources/themes/saga-blue/theme.css'      //theme
import 'primevue/resources/primevue.min.css'                 //core css
import 'primeicons/primeicons.css'                           //icons

import './assets/main.css'
import i18n from "@/plugins/i18n"
import pl from "@/plugins/pl.json"

const app = createApp(App)

app.use(createPinia())
app.use(router)
app.use(PrimeVue)
app.use(i18n, pl)
app.mount('#app')

7. 测试用语言包(src/plugins/pl.json)

{
  "some": {
    "key": "test"
  }
}

8. 组件使用代码(src/views/Home.vue)

<template>
  <div>
    <input v-color="'red'" />
    {{$translation('some.key')}}
  </div>
</template>
<script setup lang="ts">

import {onMounted} from "vue";

const vColor = {
  mounted: (el: HTMLElement, bind: { value: string}) => {
    el.style.color = bind.value;
  }
}

const test = $translation('some.key');

onMounted(() => {
  console.log(test)
})

</script>

具体异常

  • <template>中调用{{$translation('some.key')}}出现警告(提示“无法解析名称 $translation”),但运行时正常显示内容;
  • <script setup>中直接声明const test = $translation('some.key')报错(提示“找不到名称 '$translation'”)。

解决步骤

1. 修正主TypeScript配置的文件引用

当前i18n.d.ts仅被tsconfig.config.json(Node环境配置)包含,主项目的tsconfig.json需要添加该文件的引用。修改主tsconfig.json的include数组:

{
  "extends": "@vue/tsconfig/tsconfig.web.json",
  "include": ["env.d.ts", "src/**/*", "src/**/*.vue", "src/i18n.d.ts"],
  // 其他配置...
}

2. 在<script setup>中正确获取全局属性

Vue3的<script setup>语法无法直接访问globalProperties上的属性,需通过getCurrentInstance()获取:

<script setup lang="ts">
import {onMounted, getCurrentInstance} from "vue";

const vColor = {
  mounted: (el: HTMLElement, bind: { value: string}) => {
    el.style.color = bind.value;
  }
}

// 获取组件实例并提取$translation方法
const instance = getCurrentInstance();
const $translation = instance?.proxy?.$translation as (key: string) => string;

onMounted(() => {
  if ($translation) {
    const test = $translation('some.key');
    console.log(test);
  }
})
</script>

3. 重启IDE并验证

修改配置后重启WebStorm,执行npm run type-check确认类型检查通过,此时模板和脚本中的类型提示应该正常。


内容的提问来源于stack exchange,提问作者byczy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 03:25:10