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

如何在TypeScript中将类作为函数参数传递并打印类名

TypeScript 传类作为参数并打印类名实现方案

基础实现

通过构造函数的name属性即可直接获取类名,参数类型限定为基类的构造函数类型,保证只能传入基类和它的子类:

// 基类定义
class Base {
  // 基类公共逻辑
}

// 三个继承基类的子类
class Sub1 extends Base {}
class Sub2 extends Base {}
class Sub3 extends Base {}

// 接收类作为入参的函数
// 参数类型表示:所有可实例化、且实例属于Base类型的构造函数
function logClassName(cls: new (...args: any[]) => Base) {
  console.log('类名:', cls.name)
}

// 测试
logClassName(Base) // 输出 类名: Base
logClassName(Sub1) // 输出 类名: Sub1
logClassName(Sub2) // 输出 类名: Sub2
logClassName(Sub3) // 输出 类名: Sub3

混淆兼容方案

如果项目打包会开启代码混淆压缩,原生的name属性会返回混淆后的短字符,无法拿到原始类名,这种情况可以在类上添加静态属性存储固定类名:

class Base {
  static readonly CLASS_NAME = 'Base'
}

class Sub1 extends Base {
  // 重写静态属性,override关键字保证和基类属性名一致
  static override readonly CLASS_NAME = 'Sub1'
}
class Sub2 extends Base {
  static override readonly CLASS_NAME = 'Sub2'
}
class Sub3 extends Base {
  static override readonly CLASS_NAME = 'Sub3'
}

// 参数用typeof Base限定,自动继承静态属性的类型约束
function logClassName(cls: typeof Base) {
  console.log('类名:', cls.CLASS_NAME)
}

说明

  • 用typeof Base和new (...args: any[]) => Base作为参数类型效果一致,都能实现只允许传入基类和子类的构造函数的类型校验。
  • 不需要类型校验的场景可以直接把参数类型设为Function,但不推荐,会丢失TypeScript的类型安全能力。

内容的提问来源于stack exchange,提问作者Johanur Rahman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 15:06:03