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

TypeScript中keyof typeof定义的类型为何无法接收Object.keys返回值

问题产生原因

TypeScript 中 Object.keys() 的返回值类型默认被定义为 string[],这是 TypeScript 类型系统的有意设计:因为 JavaScript 对象允许存在类型定义之外的额外动态属性,TS 无法保证运行时拿到的键完全匹配你定义的对象类型的键集合,所以不会自动把返回值收窄为 (keyof T)[] 类型,因此直接赋值给 SportsTypes[] 类型的变量会触发类型不匹配报错。

解决方法

方法1:直接使用类型断言

如果你能确定运行时 SportsIcons 不存在额外的未定义属性,直接加类型断言告诉 TS 你明确知道返回值类型即可:

export type SportsTypes = keyof typeof SportsIcons
export const sports: SportsTypes[] = Object.keys(SportsIcons) as SportsTypes[];

方法2:封装通用类型安全工具函数

如果需要频繁获取对象的类型化键列表,可以封装一个通用工具函数复用:

// 全局复用的工具函数
function getTypedKeys<T extends object>(obj: T) {
  return Object.keys(obj) as Array<keyof T>;
}

// 业务代码使用
export type SportsTypes = keyof typeof SportsIcons
export const sports: SportsTypes[] = getTypedKeys(SportsIcons);

注意:两种方案都依赖你保证运行时 SportsIcons 的实际属性和 TypeScript 层面的类型定义完全一致,如果存在额外属性会有类型安全隐患,常规业务场景下只要你的对象是静态定义的,都可以放心使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:15:09