Angular 中推荐用 inject() + ?? 设置依赖默认值,如 private config = inject(CONFIG_TOKEN, { optional: true }) ?? { apiUrl: 'https://api.example.com', timeout: 5000 };也可通过 providers 注册 useValue 兜底。

在 Angular 中,Inject 本身不直接支持设置默认值,但可以通过 Optional + Inject 配合逻辑判断,或更推荐的方式——使用 inject(Angular 14+ 推荐的注入函数)配合空值合并操作符(??)来安全获取依赖并提供默认值,从而避免因上层未提供 token 而导致的运行时错误。
用 inject + ?? 设置默认值(推荐)
这是目前最简洁、类型安全且符合 Angular 最佳实践的方式。适用于构造函数外的注入(如组件类、服务内部),也支持在构造函数中通过 inject(需搭配 Injector 或启用 useValue 等)。
- 定义一个可选的 InjectionToken:
- 在组件或服务中安全注入并设默认值:
this.config = inject(CONFIG_TOKEN, { optional: true }) ?? { apiUrl: 'https://api.example.com', timeout: 5000 };
}
或者更常见于类字段初始化(非构造函数内):
private config = inject(CONFIG_TOKEN, { optional: true }) ?? {apiUrl: 'https://api.example.com',
timeout: 5000
};
用 @Optional() + @Inject() 在构造函数中处理
适用于必须在构造函数中注入,且需要兼容老版本 Angular 的场景。注意:仅加 @Optional() 不会自动给默认值,需手动判断。
- 写法示例:
@Optional() @Inject(CONFIG_TOKEN) private configToken: { apiUrl: string; timeout: number } | null
) {
this.config = configToken ?? { apiUrl: 'https://api.example.com', timeout: 5000 };
}
⚠️ 注意:@Optional() 让注入返回 null(而非抛异常),但你仍要主动做空值处理;TypeScript 类型需包含 | null 或使用非空断言(不推荐)。
注册时提供默认值(预防性方案)
更根本的解法:在模块或根注入器中为 token 提供一个兜底值,这样所有地方 inject(CONFIG_TOKEN) 都能拿到值,无需处处判空。
- 在
providers中注册默认值:
{
provide: CONFIG_TOKEN,
useValue: { apiUrl: 'https://api.example.com', timeout: 5000 }
}
]
若上层模块想覆盖它,只需在子 injector 中重新 provide 同一 token 即可,Angular 会按 injector 树就近优先查找。
避免常见错误
-
不要只用
@Inject不加@Optional:没提供 token 时直接报错NullInjectorError; -
不要在
useFactory中忽略deps的可选性:如果 factory 依赖一个可能不存在的 token,也要在deps数组里对应加上{ token: XXX, optional: true }; -
类型守卫建议补全:对可能为
null或undefined的注入结果,可用assertDefined或自定义守卫增强类型推导。

















