I18nContext 错误“对象可能未定义 I18nContext.current().lang

问题描述 投票:0回答:2

我正在 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 };
  }
}
nestjs internationalization nestjs-i18n
2个回答
0
投票

经过摸索,我通过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 };
  }
}

0
投票

当可能访问对象上可能未定义的属性或方法时,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”),但您可以选择适合您的应用程序的默认语言。

© www.soinside.com 2019 - 2024. All rights reserved.