Typescript 如何检查实例实现接口

Typescript 如何检查实例实现接口,typescript,express,Typescript,Express,在PHP中,我们可以像下面这样检查它 和我想在Typescript中检查它的方式一样。我是这样做的 public handle() { return (err: any, req: Request, res: Response, next: any) => { switch (err.constructor) { case MyException: var response

在PHP中,我们可以像下面这样检查它

和我想在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);

            }
        }
 }

我想检查
IMyException
而不是
MyException
。我如何做到这一点?

这在TypeScript中是不可能的,因为接口只在编译时存在。

这在TypeScript中是不可能的,因为接口只在编译时存在。

接口在运行时不存在。 TypeScript接口只保证。假定符合类型的类实例(例如,
err:MyException
)不一定是同名类的实例(原型继承自该类)

为了在运行时使用接口,它应该是一个类。如果一个类由于某种原因不应该被实例化,那么它应该是抽象的,并且具体的类应该继承自它:

abstract class BaseMyException {
  ...
}

class MyException extends BaseMyException {}

然后可以使用
errinstanceof BaseMyException
断言它是此类的实例。请注意,
err.constructor
只检查自己的构造函数。

运行时接口不存在。 TypeScript接口只保证。假定符合类型的类实例(例如,
err:MyException
)不一定是同名类的实例(原型继承自该类)

为了在运行时使用接口,它应该是一个类。如果一个类由于某种原因不应该被实例化,那么它应该是抽象的,并且具体的类应该继承自它:

abstract class BaseMyException {
  ...
}

class MyException extends BaseMyException {}

然后可以使用
errinstanceof BaseMyException
断言它是此类的实例。请注意,
err.constructor
只检查自己的构造函数。

我想检查IMyException,而不是MyException-顺便问一下,这背后的原因是什么?这可能会影响案例的处理方式。如果我使用另一个实现“IMyException”的类“YourException”,那么我必须显式检查实例。如果我使用接口类型检查,我们不需要更改代码。是的,它不会是这个类的实例。你必须像通常在JS(而不是TS)中那样回避输入它。我想检查IMyException,而不是MyException——顺便问一下,这背后的原因是什么?这可能会影响案例的处理方式。如果我使用另一个实现“IMyException”的类“YourException”,那么我必须显式检查实例。如果我使用接口类型检查,我们不需要更改代码。是的,它不会是这个类的实例。您必须像通常在JS(而不是TS)中那样将其键入duck。