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.
