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
相关产品推荐
相关产品推荐

