Как проверить экземпляр реализует интерфейс - PullRequest
0 голосов
/ 09 мая 2018

В PHP мы можем проверить это следующим образом. Смотрите здесь

interface IInterface
{
}

class TheClass implements IInterface
{
}

$cls = new TheClass();
if ($cls instanceof IInterface) {
    echo "yes";
}

Так же, как я хочу проверить это в Typescript.Я так и сделал.

public handle() {

        return (err: any, req: Request, res: Response, next: any) => {

            switch (err.constructor) {

                case MyException:
                    var response = err.getResponse();
                    res.status(500).send(response);
                    break;
                default:
                    res.status(500).send(err.message);

            }
        }
 }

Вместо MyException Я хочу проверить IMyException.Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Интерфейсы не существуют во время выполнения. Интерфейсы TypeScript гарантируют только структурную совместимость . Экземпляр класса, который должен соответствовать типу (например, err: MyException), не обязательно должен быть экземпляром класса с тем же именем (прототипно наследовать от него).

Для того чтобы интерфейс использовался во время выполнения, он должен быть классом. Если класс по какой-то причине не предполагается создавать экземпляром, он должен быть абстрактным, и конкретный класс должен наследовать от него:

abstract class BaseMyException {
  ...
}

class MyException extends BaseMyException {}

Тогда можно утверждать, что он является экземпляром этого класса с err instanceof BaseMyException. Обратите внимание, что err.constructor проверяет только собственный конструктор.

0 голосов
/ 09 мая 2018

Это невозможно в TypeScript, поскольку интерфейсы существуют только во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...