In TypeScript, I'm writing a function that takes an Error factory as an argument: either a class name or a factory function. Something like the below:
// Alias from class-transformer package
type ClassConstructor<T> = {
  new (...args: any[]): T;
};
function doSomething(value: number, errorFactory: () => Error | ClassConstructor<Error>) {
  if (value === 0) {
    // Zero is not allowed
    if (/* errorFactory is a class constructor */) {
      throw new errorFactory()
    } else {
      throw errorFactory()
    }
  }
}
In the above function, errorFactory can be an Error class, such that the following code works:
doSomething(0, Error);
Or it can be a function that creates an Error:
doSomething(0, () => new Error());
The issue is that ClassConstructor is a TypeScript type, so it doesn't survive compilation to JavaScript.
typeof(Error) is function, and so is typeof(()=>{}).
So how to determine the parameter's type? What should be the test in /* errorFactory is a class constructor */?
 
    