【问题标题】:Extending a generics class with nested generics使用嵌套泛型扩展泛型类
【发布时间】:2017-11-22 09:59:44
【问题描述】:

打字稿中有没有办法以这种方式扩展类:

class ChildClass<Wrapper<A>> extends SuperClass<A>

这不起作用,但想法是将泛型类型包装到已知构造中。以下是文档:

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md

这听起来有点类似于这个问题:

Can you subclass a generics class with a specific typed class?

我没有做太多 oop,所以我对协变和逆变之类的东西不是很熟悉,任何帮助将不胜感激。

【问题讨论】:

    标签: oop typescript generics nested-generics


    【解决方案1】:

    在extends 之前写ChildClass&lt;Wrapper&lt;A&gt;&gt; 没有任何意义,因为您在此处声明 泛型类型参数。这意味着你可以给它们一个名字,如果你需要的话,一个约束(例如ChildClass&lt;A extends Wrapper&gt;)。 Wrapper&lt;A&gt; 在这种情况下是什么意思?编译器无法理解。

    绝对可能的是在扩展的另一边上使用Wrapper&lt;A&gt;,因为A不是(正式的)类型参数,而是一个类型参数。这意味着您正在使用之前定义的类型参数,并且可以使用它生成新类型。

    因此,根据您实际想要做什么,您有两种选择:

    A 可分配给Wrapper

    当您想确保AWrapper 或派生类时,请使用通用约束:

    class ChildClass<A extends Wrapper> extends SuperClass<A>
    

    AWrapper&lt;&gt;的类型参数

    如果Wrapper&lt;&gt; 本身是一个泛型类或接口,并且您想使用A 作为其类型参数,请执行以下操作:

    class ChildClass<A> extends SuperClass<Wrapper<A>>
    

    【讨论】:

    • 是的,Wrapper 本身就是一个泛型类,A 是它的论点...我尝试了错误的方法,但现在我看到它是这样的,它实际上是有道理的跨度>
    • class ChildClass&lt;A implements Wrapper&gt; extends SuperClass&lt;A&gt;{} 不是有效的 TypeScript。一个泛型类型参数只有extends 一个类型(即使那个类型是一个接口),它永远不会implements 它。所以class ChildClass&lt;A extends Wrapper&gt; extends SuperClass&lt;A&gt;{} 是表达generic constraint 的唯一合适方式,A 可以分配给Wrapper
    • @jcalz 我已从答案中删除了该部分。
    猜你喜欢
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-02-03
    • 1970-01-01
    • 2011-08-28
    • 2023-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多