Ну и как на входе функции пометить, что один из аргументов функции будет класс?
С помощью typeof:
class Greeter {
greeting: string;
constructor(message: string) {
this.greeting = message;
}
greet() {
return "Hello, " + this.greeting;
}
}
function useGreeter(cls: typeof Greeter): Greeter {
return new cls("world");
}
useGreeter(Greeter);
Если попробовать вызвать
useGreeter(function () {});
, то TS скажет, что сигнатура не совпадает, ЧТиД.
Класс от простой функции в рантайме отличить нельзя, мне кажется. С точки зрения JS -- и то и другое функция. Можно декорировать все нужные классы каким-то свойством -- если оно есть, то это класс, но это не очень изящно.
Отличить класс от объекта просто, первое это функция, второе -- нет:)