Как типизировать асинхронный конструктор, если он не возвращает экземпляр?

Если в асинхронном конструкторе не возвращается экземпляр класса, то мы не можем типизировать его с помощью обычного возвращаемого значения. Вместо этого мы можем использовать тип Promise<void> для обозначения того, что конструктор возвращает Promise, который не возвращает никакого значения.

Прежде всего, необходимо объявить класс и его конструктор. Например, пусть у нас будет класс Foo со следующим асинхронным конструктором:

class Foo {
  constructor() {
    return new Promise<void>(async (resolve) => {
      // Логика асинхронного кода в конструкторе
      // ...
      
      resolve();
    });
  }
}

Здесь мы создаем новый Promise и передаем в него функцию с асинхронным кодом внутри конструктора. Внутри этой функции можно выполнить асинхронные операции, например, что-то загрузить из базы данных или выполнить запрос к API. Когда все асинхронные операции завершены, мы вызываем функцию resolve, чтобы указать, что Promise выполнен успешно без возвращения значения.

Теперь мы можем типизировать конструктор класса Foo с помощью типа Promise<void>:

class Foo {
  constructor(): Promise<void> {
    return new Promise<void>(async (resolve) => {
      // Логика асинхронного кода в конструкторе
      // ...
      
      resolve();
    });
  }
}

Теперь, когда создается экземпляр класса Foo, результатом будет Promise, который будет разрешен, когда асинхронный код в конструкторе закончит свое выполнение.

new Foo().then(() => {
  console.log('Конструктор завершен');
});

Здесь мы создаем новый экземпляр класса Foo и вызываем then(), чтобы получить доступ к содержимому результирующего Promise. Внутри обратного вызова then() мы можем выполнять дополнительные действия после завершения конструктора.

Важно заметить, что асинхронный конструктор может быть полезен, если нам необходимо выполнить какую-то асинхронную инициализацию перед созданием экземпляра класса. Такой подход может быть полезен, например, при подключении к базе данных или загрузке конфигурации.