class A {} abstract class B extends A {} function NewA(Factory: typeof A) { return new A; } function NewB(Factory: typeof B) { return new B; } NewA(A); NewA(B); NewB(A); NewB(B);