目录
- 1,问题
- 2,解决
1,问题
在 Vue3 项目中使用 vue-i18n v9.14.0 时,可以:
<template><div>{{ t('xxx') }}</div>
</template><script setup lang="ts">
import { useI18n } from "vue-i18n";
const { t } = useI18n();
</script>
也可以直接使用 $t
:
<template><div>{{ $t('xxx') }}</div>
</template>
虽然可以正常渲染,但会有 Typescript
的报错:
2,解决
因为 vue-i18n 在 Vue 实例上添加了该属性,比如:
<script setup lang="ts">
// getCurrentInstance 需要在组件中使用。
import { getCurrentInstance } from "vue";
const {appContext: {config: { globalProperties },},
} = getCurrentInstance();
console.log(globalProperties.$t);
</script>
所以根据报错信息,猜测是 globalProperties
对象上没有定义这个属性,所以报错。那就看下这个属性的类型定义:
// node_modules\@vue\runtime-core\dist\runtime-core.d.tsexport declare const getCurrentInstance: () => ComponentInternalInstance | null;export interface ComponentInternalInstance {// ...appContext: AppContext;
}export interface AppContext {// ...config: AppConfig;
}export interface AppConfig {// ...globalProperties: ComponentCustomProperties & Record<string, any>;
}// 默认为空
export interface ComponentCustomProperties {
}
解决:手动添加类型声明文件,给 ComponentCustomProperties
添加 $t
属性即可。
目录 src/vue-i18n.d.ts
,
/* eslint-disable */
import Vue from "vue";
declare module "@vue/runtime-core" {export interface ComponentCustomProperties {$t: (key: string, ...args: any[]) => string;}
}
注意,要保证该声明文件在
tsconfig.json
配置文件的include
配置项中。
以上。