PassFront
  1. PassFront
  2. База знаний
  3. Типизация функций

Как описать в TypeScript класс который создается внутри функции и возвращается наружу?

Типизация функций

Класс, созданный внутри функции, описывают через тип экземпляра и тип конструктора — InstanceType и typeof.

function createStore<T>(initial: T) {
  return class Store {
    private value = initial;
    get() { return this.value; }
    set(next: T) { this.value = next; }
  };
}

const CounterStore = createStore(0);
type CounterStoreCtor = typeof CounterStore;            // тип конструктора
type CounterStoreInstance = InstanceType<CounterStoreCtor>; // тип экземпляра

const store: CounterStoreInstance = new CounterStore();
store.set(5);

Явный тип возврата

Если нужно описать возвращаемое значение функции заранее, задают интерфейсы:

interface Store<T> { get(): T; set(next: T): void }
interface StoreCtor<T> { new (): Store<T> }

function createStore<T>(initial: T): StoreCtor<T> {
  return class implements Store<T> {
    private value = initial;
    get() { return this.value; }
    set(next: T) { this.value = next; }
  };
}

Миксины

Тот же приём используют для миксинов: функция принимает класс и возвращает расширенный класс.

Коротко для собеседования

Тип конструктора — typeof Класс или интерфейс с new (): T, тип экземпляра — InstanceType<typeof Класс>; для явного API описывают интерфейсы экземпляра и конструктора.

Подробнее: TypeScript Handbook — Mixins

Другие вопросы раздела