typescript - 使用 typescript 接口继承进行类型检查
问题描述
我有一个接口和两个扩展它的接口:
interface Layer {
name: string;
pretty_name: string;
}
interface SubLayer extends Layer{
url: string;
}
interface AnotherLayer extends Layer{
file: string;
}
然后我有一个服务,我有处理任何Layer
参数的函数,然后需要区分子接口并根据以下内容调用正确的函数:
class LayerDataService {
static getLayer(layer: Layer) {
if (......) {
return LayerDataService.getSubLayer(layer as SubLayer );
}
else if (......) {
return LayerDataService.getAnotherLayer(layer as AnotherLayer);
}
}
static getAnotherLayer (layer: AnotherLayer) {
}
static getSubLayer(layer: SubLayer) {
}
}
所以在......那里我想区分实现的层和实现SubLayer
的层AnotherLayer
。
所以我知道我不能使用 instanceof,因为它们不是类,它们是实现接口的对象。但是有没有一种方法不需要像我在类型保护中那样手动检查每个属性?
解决方案
由于接口在编译时被擦除,因此没有关于它们的运行时信息,因此没有instanceof
. 我能想到的唯一解决方案是反转依赖关系,所以它是决定如何调用它的层......
class LayerDataService {
static getLayer(layer: Layer) {
layer.get(this);
}
}
interface Layer {
name: string;
pretty_name: string;
get(service: LayerDataService): void;
}
interface SubLayer extends Layer{
url: string;
}
interface AnotherLayer extends Layer{
file: string;
}
这样,每个实现都负责调用 上的相关函数LayerDataService
,这无疑增加了开销。我不完全确定这是否适用于您的情况,但我认为值得一提。
推荐阅读
- airflow - 使用 MySqlToGoogleCloudStorageOperator 对记录进行分页
- c# - 将数据表对象转换为 int
- maven - 测试中的mule maven错误,无法解决依赖关系
- java - 有人可以解释一下这个代码片段吗
- php - php多维数组唯一具有不同值的键值数组
- factorization - 尝试将 BigInt 与软件 Julia 一起使用
- python-2.7 - Keras.prediction() 随着更多预测而变得更糟
- azure-cosmosdb - 查询没有子节点的 cosmos db 兄弟节点
- git - 来自 Jenkins 的 Git 结帐错误,状态码为 128
- html - 使用 CSS,当用户将鼠标悬停在元素上时,如何为元素添加圆角灰色背景