Typescript: типы для пользовательского класса ошибок в качестве аргумента - PullRequest
1 голос
/ 30 апреля 2020

У меня есть пользовательский класс Error404 и функция run, в которую я хочу передать конструктор ошибок:

class Error404 extends Error {
  constructor(message: string) {
    super(message);
    this.name = "404";
    this.message = message;
  }
}

function run(MyErr: ErrorConstructor) {
  throw new MyErr("test");
}

Но при попытке вызвать его я получаю:

run(Error404)
    ^^^^^^^^
    class Error404
    Argument of type 'typeof Error404' is not assignable to parameter of type 'ErrorConstructor'. 
    Type 'typeof Error404' provides no match for the signature '(message?: string): Error'.ts(2345)

Что я делаю не так? Как это исправить?

1 Ответ

2 голосов
/ 30 апреля 2020

Обратите внимание, что 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...