如何保存含日期数组的对象?TypeScript索引类型错误求助
解决方案:TypeScript 索引类型错误及对象存储修正
我来帮你分析下问题并给出对应的解决方案:
问题根源
你遇到的报错“Can not use 'Date' type as index type.”主要有两个原因:
- 类型定义与实际操作不匹配:你把
idLikes定义成了对象数组([{ _id: string; piinsId: string; createdAt: Date; }]),但在构造函数里却把它当作键值对对象来操作(用_id/piinsId/createdAt作为索引赋值),这本身就违背了类型约定。 - 索引类型限制: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é
相关产品推荐
相关产品推荐

