【问题标题】:How to initialize a class stored in a variable of an abstract class?如何初始化存储在抽象类的变量中的类?
【发布时间】:2021-04-28 04:58:24
【问题描述】:

我正在开发一个 TypeScript 项目以获得乐趣,但遇到了一个有趣的情况,我无法实例化对类的引用,这可能是因为 TypeScript 假定它是一个类的实例

const programClass: Program = this.fetchProgram(programName) as Program

fetchProgram 正在从 map 返回一个 program 类,其中每个程序都已从文件中动态加载。

地图创建示例:

const programPath = "../../../programs"
const programFiles = fs.readdirSync(path.join(__dirname, programPath))

programFiles.forEach(file => {
  file = path.join(__dirname, programPath, file)
  const cmdClass = require(file).default
  const command = new cmdClass() as Program
  this.commands.set(command.alias, command)
})

每个“程序”都是一个导出类的文件,该类扩展了抽象类program

示例程序:

export default class ProgramEcho extends Program {
  alias = "echo"
  constructor(options: ProgramOptions) {
    super(options)
    console.log(`DEBUG: Program Instantiated: Echo`)
  }
}

现在, 回到第一个代码sn -p。这确实被视为Program 的一个实例,而我确实需要它是某种扩展Program 的可构造类。

const programClass: Program = this.fetchProgram(programName) as Program
const program = new programClass()

错误:

const programClass: Program
This expression is not constructable.
  Type 'Program' has no construct signatures.ts(2351)

看起来你可以做一个简单的工厂模式,其中抽象类program 有一个名为create 的函数,它返回一个新的Program,但你不能返回一个抽象类的实例。

【问题讨论】:

    标签: typescript constructor abstract-class factory


    【解决方案1】:

    如您所见,Program 类型指的是Program 类的一个实例。你想要的是一个可以创建Program 实例的构造函数。假设您的所有 Program 子类都采用相同的构造函数参数,您想要的类型是:

    type ProgramConstructor = new (options: ProgramOptions) => Program;
    

    这允许您创建一个实例:

    const programClass: ProgramConstructor = this.fetchProgram(programName) as ProgramConstructor;
    const options: ProgramOptions = ??? // not sure where this comes from
    const program = new programClass(options);
    

    Typescript Playground Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-10
      • 2019-08-24
      • 2022-01-13
      • 1970-01-01
      相关资源
      最近更新 更多