#typescript
Вопрос:
Пожалуйста, смотрите заголовок вопроса и псевдокод того, что я хочу ниже. Как заменить любую? Предпочтительно не делать какой-то огромный ручной тип объединения.
abstract class Letter {}
class A extends Letter {}
class B extends Letter {}
class C extends Letter {}
// potentially hundreds more "letters"
type LetterClass = any
const exampleUsage: LetterClass[] = [A, B, C]
попытка с помощью typeof
type LetterClass = typeof Letter
const letters: LetterClass[] = [A, B, C]
const sample = letters[0]
new sample() // Cannot create an instance of an abstract class.
Комментарии:
1. Не могли бы вы поделиться тем, для чего вам это нужно? В зависимости от вашего варианта использования, может быть лучше вместо этого создать массив конструкторов.
2. У меня есть класс фабрики, который содержит карту «имя/псевдоним для класса», позволяющую фабрике обращаться к дочерним фабрикам, а затем создавать их экземпляры
3. Отлично, поэтому, если все, что вам нужно, — это создать экземпляры классов, я думаю, вы могли бы хранить только конструкторы этих типов, а не сами классы. Так было бы намного проще, что-то вроде
letters: (() => Letter)[] = [() => new A(), ...]
(я не знаю, ТС, но вы меня поняли).4. Я предпочитаю не вести список предварительно созданных классов, а создавать экземпляры, когда возникает реальная необходимость в одном из подклассов. При этом я хотел бы правильно ввести список подклассов
5.
() => new A()
будет каждый раз создавать новый объект, он не создается до его вызова. Если вам действительно все еще нужен тип, вы можете сохранить кортежи, содержащие как тип, так и конструктор.
Ответ №1:
Вы можете использовать такой тип: {new(): Letter}
. Полный пример:
abstract class Letter {}
class A extends Letter {}
class B extends Letter {}
class C extends Letter {}
// potentially hundreds more "letters"
type LetterClass = {new(): Letter}
const letters: LetterClass[] = [A, B, C]
const sample = letters[0]
new sample()
Ответ №2:
Вы можете использовать typeof
ключевое слово в typescript для создания типа для ваших классов.
type LetterClass = typeof Letter;
Комментарии:
1. Пожалуйста, смотрите обновленный вопрос о том, что происходит. Спасибо!