Tengo la siguiente clase TS:
export class TestClass { constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) { } }Implementaciones:
new TestClass({a:123}); new TestClass({b:'hello'});Estoy buscando una manera de establecer valores predeterminados para cada una de las propiedades de las opciones (a, b, c, etc.), de modo que el desarrollador pueda enviar solo una parte de los parámetros, y los otros parámetros no asignados obtendrán sus valores predeterminados.
Esta opción no esta disponible:
constructor(public options: { a?: number = 0, b?: string = '', c?: boolean = false, d?: number = 1 }) { }debido a la restricción "Una propiedad literal de tipo no puede tener un inicializador en TS" .
Entonces, la forma en que lo implemento ahora es la siguiente:
constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) { !options.a && (options.a = 0), !options.b && (options.b = ''), !options.c && (options.c = false), !options.d && (options.d = 1) }Mi problema es que en el mundo real el parámetro de opciones contiene muchas propiedades, y no quiero forzar que cada propiedad se escriba dos veces, en la firma del constructor y en el cuerpo del constructor.
Mi pregunta es si hay una mejor manera de hacerlo.
Los parámetros predeterminados se usan para argumentos de función/método que no están definidos (tanto para JavaScript como para TypeScript); sin embargo, en su caso, tiene un valor de parámetro con propiedades opcionales dentro de él. Desafortunadamente, no es posible configurar esas propiedades a los valores predeterminados de forma nativa.
Sin embargo, podemos mejorar ligeramente la sintaxis de su constructor:
constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) { options.a || options.a = 0; options.b || options.b = ''; options.c || options.c = false; options.d || options.d = 1; }Si usa ES2020+, puede usar la asignación lógica nula para que su sintaxis sea aún más clara:
constructor(public options: { a?: number, b?: string, c?: boolean, d?: number }) { options.a ??= 0; options.b ??= ''; options.c ??= false; options.d ??= 1; }Más información se puede encontrar aquí .