【问题标题】:Method parameter should be subclass of given class方法参数应该是给定类的子类
【发布时间】:2017-07-27 10:43:04
【问题描述】:

我正在努力定义一种方法来正确获取基类的子类。

handle(content: AbstractClass)

直接用继承的类调用它会导致“ConcreteClass”类型的参数不可分配给“AbstractClass”类型的参数

我用一个接口尝试过,类似的结果“typeof ConcreteClass”类型的参数不可分配给“接口”类型的参数

class AbstractClass implements Interface

handle(content: Interface)

我发现了一个类似topic 的问题,但该解决方案也对我没有帮助。

interface ClassConstructor<T extends AbstractClass> {
  new(): T;
}

abstract class AbstractClass {
  private test: string;

  constructor(value: string) {}
}

class B extends AbstractClass {
  private test2: string;

  constructor(value: string, value2: number) {
    super(modal);
  }
}

class S1 {
  show(content: ClassConstructor<AbstractClass>) {}

  b() {
    this.a(B);
  }
}

开启playground

我想实现 show 方法可以采用 AbstractClass 的每个实现,而不管它是如何定义的 f.e.不同的构造函数和类似的。
我将它与 Angular 结合使用,Angular 通过构造函数解决依赖关系。

我如何使用 TypeScript 做到这一点?

【问题讨论】:

    标签: typescript inheritance typescript2.0


    【解决方案1】:

    那是因为构造函数的签名不匹配。

    这行得通:

    interface ClassConstructor<T extends A> {
        new(value: string): T;
    }
    
    class B extends A {
        private test2: string;
    
        constructor(value: string) {
            super(value);
        }
    }
    
    class S1 {
        a(content: ClassConstructor<B>) {}
        b() {
            this.a(B);
        }
    }
    

    现在不同的构造函数共享相同的签名。

    【讨论】:

    • 所以构造函数不一样就不能用了?
    • 如果构造函数不同,那么您可能需要不同的解决方案。您的确切用例是什么?在您目前提供的代码中,您只需将其更改为 a(content: { new (value: string, value2: number): B }) {} 即可,一切正常。没有真正需要ClassConstructor。所以请用你的真实场景更新你的问题,然后你可能会得到一个对你有帮助的答案
    • 我已经更新了我的问题。我希望现在更清楚了。我有一个基类,它将以不同的方式扩展,并使用由不同依赖项引起的不同构造函数。我想实现给定的方法可以采用每个实现。
    • 您可以将ClassConstructor 更改为:new(...args: any[]): T;。这应该匹配所有不同的签名
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    相关资源
    最近更新 更多