Простой ответ на мой вопрос: вы на самом деле можете ссылаться на дочерние статические члены из статического члена базового класса. Это можно сделать с помощью ключевого слова this
вместо имени базового класса (спасибо @estus за демонстрацию этого в своем ответе ).
Как разработчик в основном из языков классов, я упустил возможность использования this
в статических членах в TypeScript.
Итак, пример из моего вопроса можно исправить, заменив имя базового класса на this
всякий раз, когда мы хотим сослаться на статический член дочернего класса:
export class EntityBase {
// Static initializer doesn't work for the purpose, since it's called once during first usage of base class. Use static getter instead (below).
// public static TypeName: string = (EntityBase as any).$typeName;
// Static getter
public static get TypeName(): string {
return (this as any).$typeName;
}
public static StaticBaseMethod(): string {
return (this as any).$typeName;
}
public static seeIfWorks(): any {
return {
field: this.TypeName,
method: this.StaticBaseMethod()
};
}
}
Кроме того, моя опечатка ссылалась на базовый класс вместо дочернего при тестировании этого. Правильный путь:
// Test call
this.test = Entity.seeIfWorks()
См. Обновленный Stackblitz , где я также добавил тестовый пример для двух производных классов.