Búsqueda de sitios web

typescript - angular parámetros del constructor @optional vs uso del signo de interrogación


En Angular2 puedo usar tanto @optional como ? para denotar los parámetros opcionales en un constructor. He probado ambos y se ven similares. ¿Cuál es la diferencia entre ellos?

Respuesta #1

@Optional marca la dependencia como opcional, por lo que el inyector no generará una excepción incluso si el proveedor de servicios para la dependencia no está definido.

? es un símbolo de Typescript que marca el parámetro de la función como opcional, por lo que su propósito es diferente de @Optional.

Si usas ? en lugar de @Optional, el Injector aún intentará resolver la dependencia y, si no puede, lanzará una excepción.

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); 
  }
}

Esto generará una excepción si el servicio Engine no estaba definido

EXCEPTION: No provider for Engine! (ChildDirective -> Engine)

Aquí está el código de demostración de plunkr.

Artículos relacionados