抽象 class 作为类型的实现
Implementation of abstract class as type
我想为我的 class 的 属性 定义一个类型:
abstract class CoolStuff {
protected abstract service: any;
}
这个服务也是抽象的:
abstract class BaseService<T,K> {
// Code
}
所以我希望这样:
abstract class CoolStuff {
protected abstract service: BaseService
}
但是编译器希望我定义 T
和 K
。但是这些已经在实现的服务中定义了:
class ActualService extends BaseService<Collection, Model>{
// Code
}
所以我想做的是:
abstract class CoolStuff {
protected abstract service: instanceof BaseService;
}
但是如何呢?
最好的方法是也使 CoolStuff
通用,然后您可以在 CoolStuff
[=20 的派生 class 中指定实际类型=]
abstract class CoolStuff<T, K> {
protected abstract service: BaseService<T, K>;
}
class CoolStuffWithActualService extends CoolStuff<Collection, Model> {
protected service: ActualService
}
您也可以将 any
指定为 CoolStuff
中的类型参数,但这会导致基础 class 中的类型较弱,因为它可以将任何内容传递给 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
}
我想为我的 class 的 属性 定义一个类型:
abstract class CoolStuff {
protected abstract service: any;
}
这个服务也是抽象的:
abstract class BaseService<T,K> {
// Code
}
所以我希望这样:
abstract class CoolStuff {
protected abstract service: BaseService
}
但是编译器希望我定义 T
和 K
。但是这些已经在实现的服务中定义了:
class ActualService extends BaseService<Collection, Model>{
// Code
}
所以我想做的是:
abstract class CoolStuff {
protected abstract service: instanceof BaseService;
}
但是如何呢?
最好的方法是也使 CoolStuff
通用,然后您可以在 CoolStuff
[=20 的派生 class 中指定实际类型=]
abstract class CoolStuff<T, K> {
protected abstract service: BaseService<T, K>;
}
class CoolStuffWithActualService extends CoolStuff<Collection, Model> {
protected service: ActualService
}
您也可以将 any
指定为 CoolStuff
中的类型参数,但这会导致基础 class 中的类型较弱,因为它可以将任何内容传递给 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
}