nuxt-i18n:Lang Switcher 错误“对象可能是 'undefined'
nuxt-i18n: Lang Switcher Error "Object is possibly 'undefined'
我想使用 nuxt-i18n 插件在我的 nuxt 应用程序上构建一个语言切换器。重要的是,我使用的是 TypeScript 而不是 JavaScript.
如文档中所述 (https://i18n.nuxtjs.org/lang-switcher) 我将以下代码实现到我的 Navbar 组件中:
TheNavbar.vue
<template>
<nav class="navbar">
<div class="container">
<div>
<NuxtLink
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">{{ locale.name }}
</NuxtLink>
</div>
</div>
</nav>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
name: "TheNavbar",
computed: {
availableLocales() {
return this.$i18n.locales.filter(i => i.code !== this.$i18n.locale);
}
}
})
在我的应用程序中,此解决方案有效。但是控制台打印出如下两个错误:
ERROR ERROR in src/components/shared/TheNavbar.vue:25:14 18:49:05
TS2532: Object is possibly 'undefined'.
23 | computed: {
24 | async availableLocales() {
> 25 | return this.$i18n.locales.filter(i => i?.code !== this.$i18n.locale);
| ^^^^^^^^^^^^^^^^^^
26 | }
27 | }
28 | })
ERROR in src/components/shared/TheNavbar.vue:25:48
TS2339: Property 'code' does not exist on type 'string | LocaleObject'.
Property 'code' does not exist on type 'string'.
23 | computed: {
24 | async availableLocales() {
> 25 | return this.$i18n.locales.filter(i => i?.code !== this.$i18n.locale);
| ^^^^
26 | }
27 | }
28 | })
我在 nuxt.config.js 中的 i18n 配置:
i18n: {
locales: [
{
code: 'de',
name: 'Deutsch',
},
{
code: 'en',
name: 'English'
}
],
defaultLocale: 'de',
vueI18n: {
fallbackLocale: 'de',
messages: {
de: {
welcome: 'Willkommen'
},
en: {
welcome: 'Welcome'
}
}
}
},
试试这个:
<NuxtLink
v-if="availableLocales"
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">{{ locale.name }}
</NuxtLink>
要消除这些错误,请将 !
post-fix 表达式运算符添加到 this.$i18n.locales
,因为它不会是 null
或 undefined
,并告诉打字稿 i
可以是任何东西:
public get availableLocales(): any {
return this.$i18n.locales!.filter(i => (i as any).code !== this.$i18n.locale)
}
编辑:21 年 4 月 9 日
如果您使用的是当前版本的 Nuxt (v2.15.4),这是工作代码:
public get availableLocales(): any {
return ((this.$i18n.locales as (string | number)[])).filter((i: any) => i.code !== this.$i18n.locale)
}
我想使用 nuxt-i18n 插件在我的 nuxt 应用程序上构建一个语言切换器。重要的是,我使用的是 TypeScript 而不是 JavaScript.
如文档中所述 (https://i18n.nuxtjs.org/lang-switcher) 我将以下代码实现到我的 Navbar 组件中:
TheNavbar.vue
<template>
<nav class="navbar">
<div class="container">
<div>
<NuxtLink
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">{{ locale.name }}
</NuxtLink>
</div>
</div>
</nav>
</template>
<script lang="ts">
import Vue from 'vue';
export default Vue.extend({
name: "TheNavbar",
computed: {
availableLocales() {
return this.$i18n.locales.filter(i => i.code !== this.$i18n.locale);
}
}
})
在我的应用程序中,此解决方案有效。但是控制台打印出如下两个错误:
ERROR ERROR in src/components/shared/TheNavbar.vue:25:14 18:49:05
TS2532: Object is possibly 'undefined'.
23 | computed: {
24 | async availableLocales() {
> 25 | return this.$i18n.locales.filter(i => i?.code !== this.$i18n.locale);
| ^^^^^^^^^^^^^^^^^^
26 | }
27 | }
28 | })
ERROR in src/components/shared/TheNavbar.vue:25:48
TS2339: Property 'code' does not exist on type 'string | LocaleObject'.
Property 'code' does not exist on type 'string'.
23 | computed: {
24 | async availableLocales() {
> 25 | return this.$i18n.locales.filter(i => i?.code !== this.$i18n.locale);
| ^^^^
26 | }
27 | }
28 | })
我在 nuxt.config.js 中的 i18n 配置:
i18n: {
locales: [
{
code: 'de',
name: 'Deutsch',
},
{
code: 'en',
name: 'English'
}
],
defaultLocale: 'de',
vueI18n: {
fallbackLocale: 'de',
messages: {
de: {
welcome: 'Willkommen'
},
en: {
welcome: 'Welcome'
}
}
}
},
试试这个:
<NuxtLink
v-if="availableLocales"
v-for="locale in availableLocales"
:key="locale.code"
:to="switchLocalePath(locale.code)">{{ locale.name }}
</NuxtLink>
要消除这些错误,请将 !
post-fix 表达式运算符添加到 this.$i18n.locales
,因为它不会是 null
或 undefined
,并告诉打字稿 i
可以是任何东西:
public get availableLocales(): any {
return this.$i18n.locales!.filter(i => (i as any).code !== this.$i18n.locale)
}
编辑:21 年 4 月 9 日
如果您使用的是当前版本的 Nuxt (v2.15.4),这是工作代码:
public get availableLocales(): any {
return ((this.$i18n.locales as (string | number)[])).filter((i: any) => i.code !== this.$i18n.locale)
}