Обновление: Почему вы не хотите создавать отдельные объекты перед кэшированием изображений?Если вы делаете строительство недорогим, использование статических полей бесполезно.
Пример:
class Actor {
image: string;
showImage() {
console.log(this.image);
}
}
class GoodActor extends Actor {
image = 'good.png';
}
class BadActor extends Actor {
image = 'bad.png';
}
const myActorTypes: (typeof Actor)[] = [GoodActor, BadActor];
function preloadImages() {
for (let myActorType of myActorTypes) {
preloadImage(new myActorType().image);
}
}
function preloadImage(image: string) {
console.log(`Loading ${image}`);
}
preloadImages();
// "Loading good.png"
// "Loading bad.png"
Ответ до уточнения добавлен в комментарии:
К сожалению, это не сработает.Во время выполнения у вас нет возможности ссылаться на класс объекта и, следовательно, нет доступа к статическим полям, если у вас есть только объект, но нет типа для ссылки.
Я, однако, задаюсь вопросом, почему вам нужно иметьстатическое поле.Как я писал в своем комментарии, я никогда не видел хорошего случая использования статических полей для значений, которые на самом деле являются переменными или частью иерархии / наследования объектов.
Я не понимаю ваших точных рассуждений, ноВозможный обходной путь может состоять в том, чтобы передать определенные классы Actor в ваш основной класс Actor и ссылаться на статические поля следующим образом.
type ActorType = { _image: string };
class Actor {
static _image; // I need it to be static
actorType: ActorType = null;
constructor(actorType: ActorType) {
this.actorType = actorType;
}
setImage(image) {
console.log(`Set image to ${image}`);
}
show(){ // I need it to be non-static
this.setImage(this.actorType._image); //doesn't work....
}
}
class GoodActor {
static _image = 'good.png'
}
class BadActor {
static _image = 'bad.png'
}
class MediumActor {
static _image = 'medium.png'
}
const actor = new Actor(GoodActor);
actor.show();
// "Set image to good.png"
const actor2 = new Actor(BadActor);
actor2.show();
// "Set image to bad.png"