能否提取泛型接口或类型的属性键为字符串数组?
在TypeScript中提取泛型类型的属性键为字符串数组
TypeScript的类型信息仅存在于编译阶段,编译后会被完全擦除,所以无法直接通过泛型类型参数在运行时获取属性键。但可以通过结合运行时对象和编译时类型约束的方式实现需求,具体方案如下:
可靠实现方案
我们需要传入一个符合目标类型的对象作为运行时的“类型载体”,利用Object.keys()获取键,同时通过泛型约束确保传入的对象与目标类型一致:
interface UserData { email: string; } function extractKeys<T>(obj: T): Array<keyof T> { return Object.keys(obj) as Array<keyof T>; } // 使用示例 const user: UserData = { email: 'user@example.com' }; const keys = extractKeys(user); console.log(keys); // ['email']
为什么不能直接用extractKeys<UserData>()?
泛型参数UserData是编译时类型,运行时没有任何留存,函数无法凭空获取类型的属性信息。必须依赖一个运行时存在的对象来提供键的来源,同时通过类型约束保证这个对象的结构与目标类型匹配。
进阶:仅编译时类型推导(运行时无效)
如果只需要编译时的类型提示,不想创建真实对象,可以用空对象断言为目标类型,但这种方式运行时会返回空数组,仅适合类型层面的校验:
function extractKeys<T>(): Array<keyof T> { return Object.keys({} as T) as Array<keyof T>; } // 编译时keys类型为('email')[],但运行时输出[] const keys = extractKeys<UserData>();
内容的提问来源于stack exchange,提问作者João Pedro
相关产品推荐
相关产品推荐

