角度构造函数参数@optional vs问号用法

时间:2017-09-26 17:10:24

标签: angular typescript

Angular2我可以使用@optional还是?表示构造函数中的可选参数。我尝试了两者,它看起来很相似。 他们之间有什么区别?

2 个答案:

答案 0 :(得分:6)

@Optional将依赖项标记为可选,因此即使未定义依赖项的服务提供程序,注入器也不会引发异常。

?是一个Typescript符号,它将函数参数标记为可选,因此它的目的与@Optional不同。

如果您使用?代替@Optional,则Injector仍会尝试解决依赖关系,如果不能,则会引发异常。

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)

这是插件链接。 https://embed.plnkr.co/jEZISqAksYWdaaBTFGd0/

答案 1 :(得分:1)

据我所知,大约一年前发布的TypeScript 2.0中引入了可选参数。 Angular比一年前开始。 我假设引入了@Optional(),因为还没有语言支持可选参数。