You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向带构造函数的函数动态传入Class类

解决方案

问题根源

  1. 函数参数与父类同名引发作用域冲突,且用any作为参数类型无法正确约束类构造函数的类型规范
  2. Promise未调用resolve导致异步逻辑异常挂起
  3. 类属性缺少类型标注,TypeScript无法完成有效类型校验
  4. 队列数据获取函数未处理异步逻辑(假设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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 14:28:00