vue-i18n 使用 $t 导致的 Typescript 报错问题

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.ts

export 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 配置项中。


以上。

Vue.js的多语言工具vue-i18nVue 2和Vue 3中都可以使用。在Vue 3中使用vue-i18n的方法与在Vue 2中基本相同。你可以使用vue-i18n-extract这个工具来分析你的Vue.js源代码,并提取其中的国际化文案。运行vue-i18n-extract时,它会分析你的代码,并根据配置提取出需要翻译的文本。 在Vue项目中使用vue-i18n,你需要进行一些配置。在Vue 3中,你可以在HTML中使用$t()方法来获取翻译后的文案,而在TypeScript使用$t()方法可能会报错。这是因为在TypeScript中,你需要设置全局的$t()方法。 具体在Vue 3中使用vue-i18n的方法如下: 1. 首先,安装vue-i18n。你可以使用npm或yarn等包管理工具来安装vue-i18n。 2. 配置vue-i18n。你需要在Vue应用中添加vue-i18n的配置,包括语言包、翻译文案等。 3. 在全局方法中挂载$t()方法。这步是在Vue 3中使用vue-i18n时的重点。你需要在全局方法中挂载$t()方法,以便在TypeScript使用$t()方法时不会报错。 以上就是在Vue 3中使用vue-i18n的基本方法。通过配置和使用vue-i18n,你可以实现在Vue.js项目中的多语言支持。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [vue-i18n提取-使用静态分析管理vue-i18n本地化。 报告丢失和未使用i18n条目。-Vue.js开发](https://download.csdn.net/download/weixin_42134097/19135884)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [vue3中使用vue-i18n(ts中使用$t, vue3不用this)](https://blog.csdn.net/JaneLittle/article/details/127112273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

下雪天的夏风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值