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
