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

标签 angular typescript

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)

Here is plunkr demo code .

关于 Angular 构造函数参数@optional vs 问号用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46432229/

相关文章:

javascript - 覆盖 Angular 的 Service Worker 来处理 POST 请求

reactjs - React ES6 和传递 props

javascript - 在api.js中传递参数

Angular 6 HttpClient 仅当参数日期不为空时才设置参数日期

javascript - angular2 http.post() 到本地 json 文件

angular - 通过@Input构造组件选择器

angular - 反转 Angular 2 *ngFor

javascript - Primeng 分页器在调用 API 后无法重置第 1 页

typescript - 不可分配给类型 'string' 。类型 'void' 不可分配给类型 'string'

typescript - 如何为条件类型赋值?