【发布时间】: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