使用typescript接口继承进行类型检查

使用typescript接口继承进行类型检查,typescript,inheritance,interface,Typescript,Inheritance,Interface,我有一个接口和两个扩展接口: 接口层{ 名称:字符串; 名称:字符串; } 界面子层扩展层{ url:string; } 界面另一层延伸到另一层{ 文件:字符串; } 然后我创建了一个服务,我有一个处理任何层参数的函数,然后需要区分子接口并根据以下内容调用正确的函数: 类层数据服务{ 静态getLayer(层:层){ 如果(……){ 返回LayerDataService.getSubLayer(层作为子层); } 否则,如果(……){ 返回LayerDataService.getAnother

我有一个接口和两个扩展接口:

接口层{
名称:字符串;
名称:字符串;
}
界面子层扩展层{
url:string;
}
界面另一层延伸到另一层{
文件:字符串;
}
然后我创建了一个服务,我有一个处理任何
参数的函数,然后需要区分子接口并根据以下内容调用正确的函数:

类层数据服务{
静态getLayer(层:层){
如果(……){
返回LayerDataService.getSubLayer(层作为子层);
}
否则,如果(……){
返回LayerDataService.getAnotherLayer(层作为另一层);
}
}
静态getAnotherLayer(层:AnotherLayer){
}
静态getSubLayer(层:子层){
}
}
所以在。。。。。在这里,我想区分实现
子层的层和实现
另一层的层


所以我知道我不能使用instanceof,因为它们不是类,它们是实现接口的对象。但是有没有一种方法不需要像我在type guard中那样手动检查每个属性?

不确定我是否理解正确,但我认为您可以使用type guard功能

函数(层:未知):层是另一层{
return!!layer.file;
}

子层执行同样的操作
,然后您可以将其用作标准函数,但在括号内,您将其强类型化为指定类型。

由于接口在编译时被擦除,因此没有关于它们的运行时信息,因此没有
实例。我能想到的唯一解决方案是反转依赖关系,因此由层决定如何调用它

类层数据服务{
静态getLayer(层:层){
层。得到(这个);
}
}
界面层{
名称:字符串;
名称:字符串;
获取(服务:LayerDataService):无效;
}
界面子层扩展层{
url:string;
}
界面另一层延伸到另一层{
文件:字符串;
}

这样,每个实现都负责调用
LayerDataService
上的相关函数,这无疑增加了开销。我不完全确定这是否适用于您的情况,但我认为值得一提。

这需要我在guard中手动检查接口的每个属性,这似乎有点多余,因为我已经定义了接口本身。如果我更改接口,我还需要更改两次,一次在接口定义中,一次在类型保护中。所以基本上是复制接口定义。我希望有更好的办法。类似于
的instanceof
。是的,这可能有效。我采用了另一种方法,那就是将接口转换为类。我会把答案贴出来的