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

