Обратите внимание, что ErrorConstructor предоставляет не только возможность конструировать с помощью нового, но и с помощью вызываемого:
interface ErrorConstructor {
new(message?: string): Error;
(message?: string): Error;
readonly prototype: Error;
}
declare var Error: ErrorConstructor;
Таким образом, новые экземпляры Error могут быть созданы с помощью:
-
new Error('message')
Error('message')
Очевидно, что Error404
не соответствует второму требованию - его можно построить только через новое.
Я бы попробовал для простоты и изменения сигнатуры run:
class Error404 extends Error {
constructor(message: string) {
super(message);
this.name = "404";
}
}
function run(MyErr: new(message: string) => Error): never {
throw new MyErr('test');
}
run(Error404);