【问题标题】:How should i make method in father class determine is type base on subclass's method in typescript?我应该如何让父类中的方法确定类型是基于子类在打字稿中的方法?
【发布时间】:2022-10-13 04:47:56
【问题描述】:

我有这样的代码。

class Base{
   private getData(): Data | undefined{
        return undefined
   }
   public get output(): Data | undefined {
        return {
             ...//Other outputs
             data: this.getData()
        }
   }
}
class A{
    private getData(){
        return getDatasFromOutside()
    }
}
let x = new A()
x.output.data // Data | undefined

如您所见,打字稿认为x.output.dataData | undefined,但实际上只是Data

如何解决这个问题?

【问题讨论】:

  • getDatasFromOutside 返回什么类型?

标签: javascript typescript class


【解决方案1】:

您可以使用一些泛型来表示:

abstract class Base {
  public getData(): Data | undefined {
    return undefined
  }
  getOutput<D>(this: {getData(): D}): { data: D } {
    return {
      // ... other outputs
      data: this.getData()
    };
  }
}
class A extends Base {
  public getData(): Data {
    return getDatasFromOutside()
  }
}
let x = new A()
x.getOutput().data // getOutput<Data>(this: A): Data

(playground)

但是,这有一些限制:

  • getData 方法必须是 public 才能算作类型的一部分
  • output getter 必须是一个方法,因为 TypeScript 不支持访问器属性声明上的泛型或this 类型

更好的选择是具有两个实现的抽象基类:

abstract class Base<D = undefined> {
  protected abstract getData(): D;
  public get output(): { data: D } {
    return {
      // ... other outputs
      data: this.getData()
    };
  }
}
class A extends Base<undefined> {
  protected getData() {
    return undefined;
  }
}
class B extends Base<Data> {
  protected getData() {
    return getDatasFromOutside()
  }
}
let x = new B()
x.output.data // Data

(playground)

【讨论】:

    【解决方案2】:

    您可能希望将该方法声明为

    abstract protected getData(): Data;
    

    Base 类中,然后也使output getter 返回Data 而从不返回undefined

    【讨论】:

    • 但我想要Baseoutput.data 的任何子类是undefined,如果它没有覆盖getData 函数并且是Data,如果它覆盖它并返回一个Data 值。以另一种方式,我希望Base 的子类有一个可选的getData 方法,默认情况下它返回未定义。
    • @饕餮飨食你的问题并不清楚。您能否请edit it 提供此详细信息?
    猜你喜欢
    • 2018-07-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 2019-01-15
    • 2020-06-03
    • 2015-04-20
    • 2010-12-19
    • 2020-01-22
    相关资源
    最近更新 更多