Búsqueda de sitios web

typescript - La propiedad de la clase no se amplía al tipo heredado


Cuando asigno un valor parcial a una variable que está declarada con un tipo parcial, su tipo sigue siendo parcial:

let x: { a: string, b?: string }
x = { a: "a" }
x.b  // fine, x <=> {a:string, b?:string}

Lo mismo con una propiedad de clase:

class X {
  prop: { a: string, b?: string } = { a: "a" }
}
(new X).prop.b // fine, prop <=> {a:string, b?:string}

Sin embargo, una propiedad heredada no parece seguir esta regla y asigna el tipo exacto en su lugar:

class Y extends X {
  prop = { a: "a" }
}
(new Y).prop.b // FAIL, prop <=> {a:string}

PG

¿Cómo se puede explicar este comportamiento?

Respuesta #1

El problema es que cuando se crea la clase Y, verificará que prop sea compatible con el tipo { a: string, b?: string }, pero luego devolverá el tipo exacto del literal de objeto que pasaste, el cual no contiene b. Puedes devolver { a: string, b?: string } directamente, pero entonces perderías los nombres de las propiedades del literal de objeto, lo cual sería desafortunado. así que puedes intentar:

((new Y).prop as { a: string, b?: string }).b