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

Angular 20中@Optional传递默认值及可选InjectionToken注入默认值的实现方法问询

Angular 20中@Optional传递默认值及可选InjectionToken注入默认值的实现方法问询

嘿,刚好在Angular 20里处理过类似的需求,之前低版本里你用的那种@Optional()配合参数默认值的写法,在20里其实有几种实用的实现方式,我给你拆解一下:

  • 兼容旧写法(依然可用)
    你之前的写法只要调整装饰器的格式(确保@Optional()和@Inject()之间有空格),在Angular 20里还是能正常工作的,加上类型标注会让代码更严谨:

    import { Component, Inject, Optional } from '@angular/core';
    import { FOO } from './tokens';
    
    @Component({...})
    export class MyComponent {
      constructor(
        @Optional() @Inject(FOO) private foo: boolean = true
      ) {}
    }
    

    这里@Optional()告诉Angular:如果找不到FOO这个依赖,别报错,直接用参数后面的默认值true就行。

  • Angular 20推荐写法(使用inject()函数)
    现在Angular官方更推荐用inject()函数来获取依赖,写法更灵活,而且在构造函数外也能使用。对于可选的InjectionToken,你可以结合可选配置和空值合并运算符来设置默认值:

    import { Component, inject, InjectionToken } from '@angular/core';
    
    const FOO = new InjectionToken<boolean>('FOO');
    
    @Component({...})
    export class MyComponent {
      // 尝试注入FOO,找不到就用true作为默认值
      private foo = inject(FOO, { optional: true }) ?? true;
    
      constructor() {}
    }
    

    这种方式的好处是,依赖获取的逻辑更直观,而且如果后续需要在类的方法里动态获取依赖,也能复用这个写法。

  • 全局默认值写法(适合通用场景)
    如果你希望这个InjectionToken在全局范围内都有默认值,不需要每个注入的地方都重复写默认值,可以在定义Token的时候就设置factory:

    import { InjectionToken } from '@angular/core';
    
    const FOO = new InjectionToken<boolean>('FOO', {
      providedIn: 'root',
      factory: () => true // 全局默认值
    });
    

    这样之后,不管在哪里注入FOO,只要没有手动提供过这个Token的实例,Angular都会自动用factory里返回的true,连{ optional: true }都不用加了,非常省心。

总的来说,Angular 20并没有完全废弃旧写法,但推荐用inject()函数的方式,更符合现在的依赖注入设计趋势。如果你的项目正在逐步升级到Angular的新规范,后者会是更好的选择~

内容来源于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:45:30