Angular2 我可以同时使用 @optional 或 ?表示构造函数中的可选参数。我都试过了,看起来很相似。 它们有什么区别?
最佳答案
@Optional
将依赖项标记为可选,因此即使未定义依赖项的服务提供者,注入(inject)器也不会引发异常。
?
是一个 Typescript 符号,它把函数参数标记为可选,所以它的用途不同于@Optional
。
如果您使用 ?
代替 @Optional
,注入(inject)器仍将尝试解析依赖关系,如果不能,它将引发异常。
class Engine {}
@Directive({
selector: 'child-directive'
})
class ChildDirective {
constructor(@Optional() @Host() os:OtherService, @Optional() @Host() hs:HostService, public engine?: Engine){
console.log("os is null", os);
console.log("hs is NOT null", hs);
console.log(this.engine);
}
}
如果未定义引擎服务,这将引发异常
EXCEPTION: No provider for Engine! (ChildDirective -> Engine)
关于 Angular 构造函数参数@optional vs 问号用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46432229/