【问题标题】:How to define a "subclass of class" type?如何定义“类的子类”类型?
【发布时间】:2020-05-02 11:47:19
【问题描述】:
class SuperClass { ... }

class SubClass1 extends SuperClass { ... }
class SubClass2 extends SuperClass { ... }
class SubClass3 extends SuperClass { ... }

const foo: ??? = ...

对于foo,我想给出一个表示foo 是扩展SuperClass 的任何类的实例的类型。我知道我可以使用联合类型并列出所有子类,但必须有更好的方法。不知何故使用extends 或怎么做?


更新:

之所以问这个是因为我有这个问题:

type SomeType = { foo: SuperClass };

public someMethod<T extends SuperClass>() {

  const bar: SomeType = ... ;

  const someSet: Set<T> = new Set();

  someSet.add(bar.foo);

“SuperClass”类型的参数不能分配给类型参数 'T'。 “SuperClass”可分配给“T”类型的约束,但“T” 可以用不同的约束子类型实例化 '超类'。

嗯..也许我应该把Set&lt;T&gt;改成Set&lt;SuperClass&gt;

【问题讨论】:

  • 父类没有的子类有什么独特之处吗?为什么不希望传递父类?
  • 是的,有些方法只有子类包含,但我意识到这是一个设计错误,所以我将它们合并到超类中,现在我已经修复了可以传递父类的继承。
  • 有道理,这感觉一定是设计错误 =)

标签: typescript types typescript3.8


【解决方案1】:

这是一种变体:

interface Interface {}

class SuperClass implements Interface{  }

class SubClass1 extends SuperClass {  }

const foo: Interface = new SubClass1();

【讨论】:

    【解决方案2】:

    如果你真的想要泛型,我能想到的最接近的答案是:

    interface SuperClass {
        a: string;
    }
    
    type SomeType<T extends SuperClass> = { foo: T };
    
    function someMethod<T extends SuperClass>(bar: SomeType<T>) {
        const someSet: Set<T> = new Set();
    
        someSet.add(bar.foo);
    }
    

    【讨论】:

      【解决方案3】:

      你想达到什么目标? SuperClass 应该适合 ???。如果你希望它是 SuperClass 的每个子类的联合:嗯,这是不可能的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-07
        • 2020-06-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多