将抽象类实现为类型



我想为我的类的属性定义一个类型:

abstract class CoolStuff {
protected abstract service: any;
}

这个服务也是一个抽象的:

abstract class BaseService<T,K> {
// Code
}

所以我期待这个:

abstract class CoolStuff {
protected abstract service: BaseService
}

但是编译器希望我定义TK。但这些已经在实现的服务中定义:

class ActualService extends BaseService<Collection, Model>{
// Code
}

所以我想做的是这样的:

abstract class CoolStuff {
protected abstract service: instanceof BaseService;
}

但是怎么做呢?

执行此操作的最佳方法是也使CoolStuff泛型,然后您可以在派生类中指定实际类型CoolStuff

abstract class CoolStuff<T, K> {
protected abstract service: BaseService<T, K>;
}
class CoolStuffWithActualService extends CoolStuff<Collection, Model> {
protected service: ActualService
}

您也可以在CoolStuff中将any指定为类型参数,但这会导致基类中的类型较弱,因为它可以将任何内容传递给BaseService这可能是一个问题。

abstract class CoolStuff {
protected abstract service: BaseService<any, any>;
}
class CoolStuffWithActualService extends CoolStuff {
protected service: ActualService
}

编辑

第三种选择是将服务类型本身作为类型参数来CoolStuff并将其限制为类型BaseService<any, any>

abstract class CoolStuff<TService extends BaseService<any, any>> {
protected abstract service: TService
}
class CoolStuffWithActualService extends CoolStuff<ActualService> {
protected service!: ActualService
}

最新更新