如何向带构造函数的函数动态传入Class类
解决方案
问题根源
- 函数参数与父类同名引发作用域冲突,且用
any作为参数类型无法正确约束类构造函数的类型规范 - Promise未调用
resolve导致异步逻辑异常挂起 - 类属性缺少类型标注,TypeScript无法完成有效类型校验
- 队列数据获取函数未处理异步逻辑(假设
connectAndGetMessage为异步操作)
修复后的完整代码
import { ApplicationLogger } from "application-logger"; interface Logger {} interface Message { data: unknown; // 用unknown替代any提升类型安全性 } class ContentCreator { logger: Logger; // 显式标注属性类型 constructor(logger: Logger) { this.logger = logger; } public async create(body: Message): Promise<string[]> { return Promise.resolve([]); // 简化Promise返回写法 } } class PublicationContentCreator extends ContentCreator { constructor(logger: Logger) { super(logger); } public override async create(body: Message): Promise<string[]> { console.log("Publication: ", body); return Promise.resolve([]); } } class EventContentCreator extends ContentCreator { constructor(logger: Logger) { super(logger); } public override async create(body: Message): Promise<string[]> { console.log("Event: ", body); return Promise.resolve([]); } } // 假设为异步获取队列数据,添加async关键字与返回类型 async function connectAndGetMessage(connectionString: string): Promise<Message> { // 模拟队列数据返回逻辑 return Promise.resolve({ data: "test-queue-data" }); } // 定义构造函数类型,约束传入类必须支持Logger参数注入,返回ContentCreator子类实例 type CreatorConstructor = new (logger: Logger) => ContentCreator; async function readFromQueue(connectionString: string, Creator: CreatorConstructor) { const logger = new ApplicationLogger(); const creator = new Creator(logger); const queueData = await connectAndGetMessage(connectionString); await creator.create(queueData); } (async () => { await readFromQueue("connection-string", PublicationContentCreator); })();
关键修改点
- 构造函数类型约束:新增
CreatorConstructor类型,明确传入类的构造函数规范,避免any带来的类型隐患 - 命名冲突解决:将函数参数名从
ContentCreator改为Creator,避免与父类名重名导致的作用域混淆 - 异步逻辑修复:为
connectAndGetMessage添加异步标识,调用时用await处理异步操作,同时简化Promise返回逻辑 - 类型安全优化:将
Message的data类型改为unknown,后续可通过类型收窄进一步增强代码安全性
内容的提问来源于stack exchange,提问作者ChazUK
相关产品推荐
相关产品推荐

