如何获取泛型类型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
相关产品推荐
相关产品推荐

