2017-02-11 2 views
3
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() 

Результат:машинопись сохраняет тип, как неопределенную

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

Почему именно это первый журнал не определен?

+2

Потому что класс, который вы указываете ('B'), не определяется при назначении? –

ответ

1

Как @ E.Sundin написал в своем комментарии, класс B не существует, когда оценивается класс A.

Вам нужно иметь статический инициализатор:

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

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

    ... 
} 

... 

A.init() 
A.check() 

(code in playground)

Потому что вы хотели A.letter быть readonly есть слепок this к any иначе компилятор жалуется на отнесение к только для чтения.


Другим вариантом является назначение пустой объект, а затем заполнить его:

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

    ... 
} 

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

Но тогда A.letters потребности быть публичным, вы можете переместить его за пределы A держать его «скрытый»:

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

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

class B extends A { } 
letters["b"] = B; 
Смежные вопросы