是否可以在没有声明的超类泛型的情况下强制泛型抽象方法的类型安全?

时间:2019-02-25 19:36:32

标签: typescript generics

我有一个抽象类:

public abstract class ParentClass<T, U> {
    // a bunch of common code to prevent duplication in children
    protected abstract adaptThese(...things: Array<MyType>): Array<T>
    protected abstract adaptThose(...things: Array<MyType>): Array<U>
    // some other non-generic abstract methods
}

这是一个示例子类:

public class ChildClass extends ParentClass<FirstType, SecondType> {
    protected adaptThese(...things: Array<MyType>): Array<FirstType> {
       //...
    }
    protected adaptThose(...things: Array<MyType>): Array<SecondType> {
       //...
    }
    // implementations of the other abstract methods...
}

我的代码按原样工作,但问题是所有引用ParentClass的代码都必须将其引用为ParentClass<any, any>。由于泛型类型仅用于内部目的(仅protected东西),我想知道是否存在一种从父类中删除泛型类型的好方法,同时仍为孩子使用{{1 }}和<T>

我最初引入这些泛型是为了强制子类提供从<U>MyTypeT的某种适应,它们都是依赖于库的,并且从不{{1} }。目标是无论使用哪个底层库,都允许我项目的其余部分使用U,因为它们的设计非常相似,但是可以接受不同的类型。这将允许在不影响此层次结构之外的代码的情况下交换所选的包。 (我使用的是Angular,因此这意味着只需在一行上更改提供程序的MyType

我试图制作一种可能包含泛型的内部适配器对象,但是我不知道该如何强制子类声明和实现类似于上面的方法。

我得到的最接近的结果是在MyType的{​​{1}}类型的构造函数中添加一个参数,但是我无法使useClass成为一些通用类型,强制儿童使用类型安全。

一条可能真正有用的信息是ParentClass从不引用泛型方法本身,因此不一定必须声明它们才能供MyAdapter<any, any>使用。他们只是在强迫孩子实施他们。也许我可以使用某种界面设计来做到这一点?

简而言之:如果有条件的话,我怎么能强迫孩子实施类型安全的方法,而无需在父签名中声明类型呢?


请求了一个示例,因此这是一个简化示例,说明如何拆分类型依赖项:

any中,我可能有这样的方法:

ParentClass

在子班中:

ParentClass

有许多类似上述方法的工具或从库服务中请求状态,这些方法需要两种类型之一。

每个库的代码都非常相似,因此为什么我为面向项目的代码引入了一个父类,并让子类使用与库相关的细节。

此后我要考虑的另一个问题是,我可能能够制作一个面向项目的服务类,然后为该类提供通用类型的库集成服务,但这是相当可重写的,我仍然对此感兴趣这个问题的答案。

1 个答案:

答案 0 :(得分:2)

处理此问题的最佳方法可能是制作一个{em>不是通用的接口IParentClass,然后在以前引用{{1 }}。

IParentClass

或者,您可以提供ParentClass<any, any>作为interface IParentClass { // all the public methods from ParentClass } abstract class ParentClass<T, U> implements IParentClass { // same as before } // reference like this var foo: IParentClass; 上泛型类型参数的默认值,但这不是理想的选择,因为无法强制子类为通用。例如(我引入了一些新的方法签名来使问题更明显):

any