我正在 NestJs 中实现
nestjs-i18n
,并且我已按照此 官方文档 完成了所有设置
但是在服务中,我遇到错误“对象可能未定义”
这是我的全方位服务代码:
import { Injectable } from "@nestjs/common";
import { I18nContext, I18nService } from "nestjs-i18n";
@Injectable()
export class FeaturedAgentsService {
constructor(private readonly i18n: I18nService) {}
async test(): Promise<any> {
const message = this.i18n.t("lang.HELLO", {
lang: I18nContext.current().lang,
});
return { service: message };
}
}
经过摸索,我通过issue解决了这个问题。
出现错误
Object is possibly 'undefined'
是因为 TypeScript 正在警告 I18nContext.current() 函数返回 undefined
的可能性。访问 lang
值上的 undefined
属性可能会导致运行时错误。
为了解决此错误,我使用可选链接
(?.)
来安全地访问 lang
的 I18nContext.current()
属性,而不会导致运行时错误。
以下是正确的代码:
import { Injectable } from "@nestjs/common";
import { I18nContext, I18nService } from "nestjs-i18n";
@Injectable()
export class FeaturedAgentsService {
constructor(private readonly i18n: I18nService) {}
async test(): Promise<any> {
const message = this.i18n.t("lang.HELLO", {
lang: I18nContext.current()?.lang, /***** Solved *****/
});
return { service: message };
}
}
当可能访问对象上可能未定义的属性或方法时,TypeScript 中通常会出现“对象可能未定义”错误。在您的情况下,TypeScript 警告您 I18nContext.current().lang 可能未定义。
要解决此问题,您可以添加检查以确保在访问 I18nContext.current().lang 之前已定义它。以下是您可以修改代码来处理此问题的方法:
import { Injectable } from "@nestjs/common";
import { I18nContext, I18nService } from "nestjs-i18n";
@Injectable()
export class FeaturedAgentsService {
constructor(private readonly i18n: I18nService) {}
async test(): Promise<any> {
// Check if I18nContext.current() is defined before accessing lang
const lang = I18nContext.current()?.lang;
// Assuming you want to use a default language if lang is undefined
const message = this.i18n.t("lang.HELLO", { lang: lang || "en" });
return { service: message };
}
}
在此修改版本中,I18nContext.current()?.lang 使用可选的链接运算符 (?.),如果 I18nContext.current() 未定义,则返回未定义。然后,我们将 lang 赋给该值。如果 lang 未定义,我们将回退到默认语言(在本例中为“en”),但您可以选择适合您的应用程序的默认语言。