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

TypeScript中如何获取泛型T对应的接口名称?

核心问题原因

TypeScript 所有类型语法仅存在于编译阶段,编译为 JavaScript 后所有类型、泛型参数都会被完全擦除。你代码中的T仅在编译时做类型校验使用,运行时不存在这个变量,因此执行const type = typeof(T)必然报错。
不存在任何方法能直接从纯泛型参数T上获取运行时的类型信息,所有方案都需要额外补充运行时可访问的标识信息。


可行实现方案

方案1:显式传入类型标识参数

如果仅需要区分接口类型,可以给函数增加类型标识入参,还可以通过枚举约束避免传错:

interface User {
  id: number
  name: string
}

interface UserData {
  id: number
  user_id: number
  key: string
  value: string
}

enum ModelType {
  User = 'User',
  UserData = 'UserData'
}

function get<T>(typeName: ModelType): T {
  console.log('当前类型名称:', typeName)
  // 自定义业务逻辑
  return {} as T
}

// 调用时传入对应类型标识
get<User>(ModelType.User)
get<UserData>(ModelType.UserData)

方案2:用类替代接口定义类型

如果你的业务场景可以接受用类代替interface定义类型,可以直接把类的构造函数作为入参传递,直接读取构造函数的name属性即可获取类型名:

class User {
  id: number
  name: string
}

class UserData {
  id: number
  user_id: number
  key: string
  value: string
}

function get<T>(clazz: new () => T): T {
  console.log('当前类型名称:', clazz.name)
  // 还可以直接实例化得到对应类型的对象
  return new clazz()
}

get(User)
get(UserData)

该方案不需要手动维护字符串标识,出错概率更低。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:27:02