Cómo definir argumentos de constructor opcionales con valores predeterminados en Typescript

1 minuto de lectura

¿Es posible tener argumentos de constructor opcionales con valor predeterminado, como este?

export class Test {
    constructor(private foo?: string="foo", private bar?: string="bar") {}
}

Esto me da el siguiente error:

El parámetro no puede tener un signo de interrogación ni un inicializador.

Me gustaría crear instancias como

x = new Test();               // x.foo === 'foo'            
x = new Test('foo1');         // x.foo === 'foo1'
x = new Test('foo1', 'bar1');

¿Cuál es la forma correcta de mecanografiado para lograr esto?

Un argumento que tiene un valor predeterminado es opcional por definición, como indicado en los documentos:

Los parámetros inicializados por defecto que vienen después de todos los parámetros obligatorios se tratan como opcionales y, al igual que los parámetros opcionales, se pueden omitir al llamar a su función respectiva.

Es lo mismo para los constructores que para otras funciones, así que en su caso:

export class Test {
    constructor(private foo: string = "foo", private bar: string = "bar") {}
}

  • private foo = "foo", private bar = "bar" Supongo que el tipo se puede inferir aquí.

    – André Elrico

    14 de junio de 2019 a las 11:32

  • en mi propia preferencia personal siempre me gusta escribir definir incluso cuando es obvio

    –Derek Lawrence

    9 oct 2019 a las 16:53

  • ¿Cómo hace esto con parámetros desestructurados, de la manera más breve posible, sin duplicar la lista de campos desestructurados?

    – Dan Dascalescu

    4 de marzo de 2020 a las 2:42

Puede agregar un signo de interrogación después de sus argumentos, que es más limpio. Si agrega parámetros predeterminados, debería ser opcional por defecto.

export class Test {
   foo: string; 
   bar: string;

    constructor(foo?: string, bar?: string) {
    this.foo = foo;
    this.bar = bar;
   }
}

¿Ha sido útil esta solución?