Búsqueda de sitios web

javascript - TypeScript guarda el tipo como indefinido


class A {
    private static readonly letters: { [type: string]: any; } = { 'b' : B }

    public static check(): void {
        console.log(A.letters)
        let letters: { [type: string]: any; } = { 'b' : B }
        console.log(letters)
    }
}

class B extends A {

}

A.check()

Resultado :

{ b: undefined }
{ b: { [Function: B] check: [Function], letters: { b: undefined } } }

¿Por qué exactamente el primer registro es indefinido?

Respuesta #1

Como escribió @E.Sundin en su comentario, la clase B no existe cuando se evalúa la clase A.

Necesitarás tener un inicializador estático:

class A {
    private static readonly letters: { [type: string]: any; }

    public static init() {
        (this as any).letters = { 'b' : B }
    }

    ...
}

...

A.init()
A.check()

(código en el área de juegos)

Debido a que querías que A.letter fuera readonly, hay una conversión de this a any, de lo contrario el compilador se queja de la asignación a una propiedad de solo lectura.

Otra opción es asignar un objeto vacío y luego llenarlo:

class A {
    public static readonly letters: { [type: string]: any; } = {};

    ...
}

class B extends A { }
A.letters["b"] = B;

Pero entonces A.letters necesita ser público, puedes moverlo fuera de A para mantenerlo "oculto":

const letters: { [type: string]: any; } = {};

class A { ... }
A.letters["a"] = A;

class B extends A { }
letters["b"] = B;