You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 20中如何使用新inject语法替代构造函数中的@Inject(String)注入配置参数

Angular 20中如何使用新inject语法替代构造函数中的@Inject(String)注入配置参数

嗨,我来帮你搞定这个Angular 20里的inject语法迁移问题~

首先得先理清一个小问题:你之前用的@Inject(String)其实是不太规范的写法,Angular里注入自定义配置参数,正确的姿势是用**InjectionToken**来定义对应的令牌,这样注入和提供值的时候类型更安全,也能避免混淆。现在要转到新的inject()语法,咱们一步步来改:

第一步:定义配置参数的注入令牌

先为prefix和suffix创建专门的InjectionToken,这样后续注入和提供值都有明确的标识,还能设置默认值:

// 可以单独放在一个文件里,比如translate.tokens.ts
export const TRANSLATE_PREFIX = new InjectionToken<string>('TRANSLATE_PREFIX', {
  providedIn: 'root',
  factory: () => '/assets/i18n/'
});

export const TRANSLATE_SUFFIX = new InjectionToken<string>('TRANSLATE_SUFFIX', {
  providedIn: 'root',
  factory: () => '.json'
});

第二步:改造TranslateHttpLoader类,用inject()替代构造函数注入

把构造函数里的参数全部去掉,换成类内的inject()调用,这样就完全符合ESLint的要求了:

import { inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { TranslateLoader } from '@ngx-translate/core';
import { TRANSLATE_PREFIX, TRANSLATE_SUFFIX } from './translate.tokens';

export class TranslateHttpLoader implements TranslateLoader {
  // 用inject()获取HttpClient实例
  private http = inject(HttpClient);
  // 注入前缀和后缀的配置值,用咱们定义好的令牌
  private prefix = inject(TRANSLATE_PREFIX);
  private suffix = inject(TRANSLATE_SUFFIX);

  getTranslation(lang: string): Observable<any> {
    return this.http.get(`${this.prefix}${lang}${this.suffix}`);
  }
}

如果你的prefix/suffix允许可选(可以不提供,用默认值兜底),还可以给inject()加第二个参数:

private prefix = inject(TRANSLATE_PREFIX, { optional: true }) || '/assets/i18n/';
private suffix = inject(TRANSLATE_SUFFIX, { optional: true }) || '.json';

第三步:更新appConfig里的提供配置

现在不需要在httpLoaderFactory里手动传参数了,因为类里自己会通过inject()自动获取依赖和配置:

import { ApplicationConfig, provideHttpClient } from '@angular/core';
import { provideTranslateService } from '@ngx-translate/core';
import { TranslateLoader } from '@ngx-translate/core';
import { TranslateHttpLoader } from './translate-http.loader';
import { TRANSLATE_PREFIX, TRANSLATE_SUFFIX } from './translate.tokens';

// 简化httpLoaderFactory,不需要再传任何参数
const httpLoaderFactory = () => new TranslateHttpLoader();

export const appConfig: ApplicationConfig = {
  providers: [
    provideHttpClient(),
    // 在这里提供自定义的prefix和suffix值(如果需要覆盖默认值的话)
    {
      provide: TRANSLATE_PREFIX,
      useValue: './i18n/'
    },
    {
      provide: TRANSLATE_SUFFIX,
      useValue: '.json'
    },
    provideTranslateService({
      loader: {
        provide: TranslateLoader,
        useFactory: httpLoaderFactory,
        // 现在不需要deps数组了,因为类内用inject()自动获取所有依赖
      },
    }),
  ],
};

为啥之前的@Inject(String)写法有问题?

你之前用的@Inject(String)其实是把原生String类型当注入令牌,但这不是Angular官方推荐的方式,很容易和其他地方注入的字符串值冲突,类型也不安全。用InjectionToken才是自定义注入值的标准做法,既能明确标识注入的是什么,又能保证类型正确。

这样改完之后,既符合Angular 20的新语法要求,又能正确注入配置参数,还不用再禁用ESLint规则啦~

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 09:48:03