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

如何获取泛型类型T对应的对象的键名?

获取泛型类型T的对象键名的问题分析

你想通过泛型函数拿到传入类型T对应的对象键名,但目前试的几种写法都达不到预期——因为TypeScript的泛型是编译时类型信息,运行时会被完全擦除,你代码里的{} as T只是类型断言,实际运行时还是个空对象,所以这几个方法都会返回空数组。

为什么现有写法无效

  • Object.keys({} as T):运行时操作的是空对象,自然返回空数组,类型断言不会改变对象的实际结构
  • Object.getOwnPropertyNames({} as T):空对象没有任何自有属性,返回结果同样是空数组
  • Reflect.ownKeys({} as T):空对象不存在任何自有键(包括Symbol类型),所以也返回空数组

正确实现方式

要在运行时获取对象键名,必须传入实际的对象实例,不能只靠泛型类型。示例代码如下:

如果只需要字符串类型的键:

function getGenericTypeKeys<T extends object>(obj: T): Array<keyof T> {
  return Object.keys(obj) as Array<keyof T>;
}

如果需要同时包含Symbol类型的键:

function getGenericTypeKeys<T extends object>(obj: T): Array<keyof T> {
  return Reflect.ownKeys(obj) as Array<keyof T>;
}

原理很简单:泛型T的类型信息只在编译阶段有效,运行时根本没有T的类型数据,必须依赖实际传入的对象实例来读取键名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:22:09