Как создать тип для классов (не экземпляров), расширяющих базовый класс?

#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. Пожалуйста, смотрите обновленный вопрос о том, что происходит. Спасибо!