TypeScript中如何将字符串作为对象键?Object.keys返回值赋值报错原因解析
问题原因
TypeScript 中 Object.keys() 的返回值类型固定为 string[],这是 TypeScript 类型系统的有意设计:因为运行时对象可能包含类型定义中未声明的额外可枚举属性,所以 TS 不会直接将 Object.keys(obj) 的返回类型推导为 Array<keyof typeof obj>。
而你声明的 classStart 类型是 keyof typeof monday,本质是由 monday 所有键组成的字面量联合类型(比如 "7:25" | "8:15" | ...),宽泛的 string 类型不能直接赋值给收窄的字面量联合类型,所以会触发类型报错。
解决方案
方案1:直接做类型断言(最简单通用)
你明确知道 Object.keys(monday) 取到的每一项都是 monday 的合法键,直接加类型断言即可:
// 仅在赋值处做单次断言 classStart = Object.keys(monday)[i] as keyof typeof monday;
如果代码中会多次用到 monday 的键列表,建议在获取键的时候就整体断言,后续使用不需要重复处理:
let classStart: keyof typeof monday; const now = new Date(); // 提前断言keys的类型 const mondayKeys = Object.keys(monday) as Array<keyof typeof monday>; for (let i = mondayKeys.length - 1; i > 0; i--) { let time = mondayKeys[i].split(":"); // eslint-disable-next-line eqeqeq if (time[0] == now.getHours()) { if (time[1] <= now.getMinutes()) { classStart = mondayKeys[i]; } else { classStart = mondayKeys[i - 1]; } } }
方案2:封装通用类型安全工具函数
如果项目中频繁需要获取类型安全的对象键,可以封装一个通用工具函数复用:
function getTypedKeys<T extends object>(obj: T) { return Object.keys(obj) as Array<keyof T>; } // 使用时自动推导类型,不需要重复写断言 const mondayKeys = getTypedKeys(monday);
内容的提问来源于stack exchange,提问作者Hohi
相关产品推荐
相关产品推荐

