¿Hay alguna forma de que pueda tener una propiedad en una Class que sea opcional, pero que no esté indefinida?
Tenga en cuenta que en el ejemplo a continuación, el constructor Class toma un tipo de sí mismo (eso es intencional)
class Test { foo: number; bar: string; baz?: string; constructor(test: Test) { this.foo = test.foo; this.bar = test.bar this.baz = test.baz || "Default"; } } const first = new Test({foo: 1, bar: "Bob"}); const str = "Some Default String about Bob"; str.replace(first.baz, "New Value"); // Type 'undefined' is not assignable to type 'string | RegExp'.( Sé que puedo usar el ! operador, pero preferiría no
str.replace(first.baz!, "New Value");Parece que esta pregunta aborda la respuesta: "las propiedades de clase no pueden depender de los valores predeterminados"
Por lo que puedo decir, no desea que la propiedad de clase sea opcional, desea que el parámetro constructor sea opcional. Lo cual es bastante fácil de hacer:
interface TestParams { foo: number; bar: string; baz?: string; // optional } class Test { foo: number; bar: string; baz: string; // NOTE: not optional! constructor ({ foo, bar, baz, }: TestParams) { this.foo = foo; this.bar = bar; this.baz = baz ?? "Default"; } } Tenga en cuenta que utilicé el operador coalescente nulo en lugar del "o" lógico, de modo que si baz no está definido, asignaremos el valor predeterminado, pero si es una picadura vacía, no se sobrescribirá. Si está realmente preocupado por la duplicación, y no le importa que su constructor tome parámetros posicionales en lugar de un objeto, puede condensarlo un poco:
class Test2 { constructor ( public foo: number, public bar: string, public baz = "Default", ) {} }El comportamiento no es exactamente el mismo con respecto al parámetro opcional, pero está bastante cerca.