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

如何保存含日期数组的对象?TypeScript索引类型错误求助

解决方案:TypeScript 索引类型错误及对象存储修正

我来帮你分析下问题并给出对应的解决方案:

问题根源

你遇到的报错“Can not use 'Date' type as index type.”主要有两个原因:

  1. 类型定义与实际操作不匹配:你把idLikes定义成了对象数组([{ _id: string; piinsId: string; createdAt: Date; }]),但在构造函数里却把它当作键值对对象来操作(用_id/piinsId/createdAt作为索引赋值),这本身就违背了类型约定。
  2. 索引类型限制:TypeScript 只允许string、number或symbol作为对象的索引类型,Date类型并不符合这个要求,所以直接用createdAt作为索引会触发报错。

同时你需要保留createdAt的Date类型用于后续比较,所以不能将其转为字符串存储,下面给出几种符合需求的实现方式:


方案1:存储多条点赞记录(数组结构)

如果你的idLikes是用来保存多条点赞数据的集合,应该直接往数组中push完整的对象,而不是用索引赋值:

export class LikeActivity extends BaseActivityModel {
  // 初始化空数组,每个元素包含所有需要的属性
  idLikes: Array<{ _id: string; piinsId: string; createdAt: Date }> = [];

  constructor(_id: string, piinsId: string, createdAt: Date) {
    super();
    // 向数组添加一条完整的点赞记录
    this.idLikes.push({ _id, piinsId, createdAt });
  }
}

这种方式完全保留了createdAt的Date类型,后续可以直接用它做日期比较,比如:

// 示例:筛选出创建时间早于某个日期的点赞
const targetDate = new Date('2024-01-01');
const oldLikes = likeActivity.idLikes.filter(item => item.createdAt < targetDate);

方案2:按_id映射点赞信息(键值对结构)

如果需要通过_id快速查找对应的点赞数据,可以把idLikes定义为键值对对象,用_id(string类型)作为索引,同时保留createdAt的Date类型:

export class LikeActivity extends BaseActivityModel {
  // 用Record类型定义键值对,键是点赞的_id,值包含对应的piinsId和createdAt
  idLikes: Record<string, { piinsId: string; createdAt: Date }> = {};

  constructor(_id: string, piinsId: string, createdAt: Date) {
    super();
    // 以_id为键存储点赞信息
    this.idLikes[_id] = { piinsId, createdAt };
  }
}

这种方式既符合TypeScript的索引类型要求,又能直接使用createdAt做比较,比如:

// 示例:判断某条点赞的创建时间是否在一周内
const oneWeekAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);
const isRecent = likeActivity.idLikes['some-like-id'].createdAt > oneWeekAgo;

方案3:存储单个点赞记录(单个对象)

如果你的idLikes只需要存储单条点赞数据,那应该直接定义为单个对象,而不是数组:

export class LikeActivity extends BaseActivityModel {
  // 单个点赞对象,包含所有属性
  idLikes: { _id: string; piinsId: string; createdAt: Date };

  constructor(_id: string, piinsId: string, createdAt: Date) {
    super();
    this.idLikes = { _id, piinsId, createdAt };
  }
}

内容的提问来源于stack exchange,提问作者Raphaël Etang-Salé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:10:57