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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 22:57:04