Typescript 如何检查实例实现接口
在PHP中,我们可以像下面这样检查它 和我想在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
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。