Как описать в 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