Насколько мне известно, не существует синтаксиса, который объявляет набор свойств в классе. Таким образом можно добавить индексную подпись , но не объединение строковых литералов. Очевидно, вы можете добавить их вручную, но я полагаю, дело в том, что вы этого не хотите.
Единственное, что вы можете сделать, - это использовать объявление, объединяющее с добавить свойства в интерфейс экземпляра класса. Когда вы пишете class PostEntryIndex {}
, он создает значение с именем PostEntryIndex
, которое является конструктором класса, и интерфейс с именем PostEntryIndex
, соответствующий индексу класса. И вы можете использовать слияние интерфейсов, чтобы добавить любые свойства, которые вы хотите ... например:
interface PostEntryIndex extends IPostEntryIndex { }
class PostEntryIndex {
constructor() {
categories.map(cat => this[cat] = new Entry())
}
}
Обратите внимание, что это позволяет обойти строгую проверку инициализации свойств класса , которая идет с --strict
режим, поэтому вы не можете полагаться на компилятор, чтобы жаловаться на неинициализированные свойства. (На самом деле это используется здесь в ваших интересах, поскольку компилятор не понимает, что цикл по categories
служит для инициализации всех соответствующих свойств.)
Также обратите внимание, что как только вы объедините интерфейс таким образом, предложение implements
особенно излишне, поэтому я избавился от него. (Оказывается, предложения implements
никогда не нужны; система структурных типов TypeScript не требует, чтобы вы объявляли это A implements B
, чтобы вы использовали A
как B
, если они имеют совместимые структуры. .. но я отвлекся)
Все равно посмотрим, работает ли:
const pei = new PostEntryIndex();
pei.projects; // Entry
Выглядит неплохо. Хорошо, надеюсь, что это поможет; удачи!
Детская площадка ссылка на код