如何初始化存储在抽象类的变量中的类?



我正在做一个TypeScript项目,只是为了好玩,却遇到了一个有趣的情况,我无法实例化一个类的引用,可能是因为TypeScript假定它是一个类的实例

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

fetchProgram映射返回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">是导出一个类的文件,该类扩展了抽象类program

示例程序:

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

现在,回到第一个代码片段。这确实被视为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,但你不能返回一个抽象类的实例。

如您所见,类型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

最新更新