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

TypeScript中Date类型无getWeek属性:如何计算周起止日期?

嘿,这个问题我之前在项目里也碰到过!TypeScript抛出Property 'getWeek' does not exist on type 'Date'错误的原因很简单——你手动给Date原型添加了getWeek方法,但TypeScript默认的Date类型定义里根本不知道这个方法的存在,所以它会认为你在调用一个不存在的属性。

下面给你两种解决思路,既能保留你的功能,又能让TypeScript不再报错:

1. 给Date类型添加全局声明

首先,你可以直接在代码里添加全局接口扩展,告诉TypeScriptDate原型上有这个getWeek方法:

// 先实现你的getWeek方法逻辑
Date.prototype.getWeek = function(start?: number) {
  start = start || 0;
  const today = new Date(this.setHours(0, 0, 0, 0));
  const day = today.getDay() - start;
  const date = today.getDate() - day;
  const startDate = new Date(today.setDate(date));
  const endDate = new Date(today.setDate(date + 6));
  return [startDate, endDate];
};

// 扩展全局Date接口,让TS识别getWeek方法
declare global {
  interface Date {
    getWeek(start?: number): [Date, Date];
  }
}

// 现在调用就不会报错了
const currentWeekDates = new Date().getWeek();
console.log('周开始:', currentWeekDates[0], '周结束:', currentWeekDates[1]);

2. 优化原方法,避免修改原Date对象(可选但推荐)

原代码里的this.setHours(0,0,0,0)会修改调用该方法的原Date对象,可能产生意外的副作用。推荐改成不修改原对象的版本:

Date.prototype.getWeek = function(start?: number) {
  start = start ?? 0; // 用空值合并运算符处理start为0的情况更严谨
  // 复制当前日期的副本,避免修改原对象
  const dateCopy = new Date(this);
  dateCopy.setHours(0, 0, 0, 0);
  
  const dayOffset = dateCopy.getDay() - start;
  const startDate = new Date(dateCopy);
  startDate.setDate(dateCopy.getDate() - dayOffset);
  
  const endDate = new Date(startDate);
  endDate.setDate(startDate.getDate() + 6);
  
  return [startDate, endDate];
};

// 同样需要添加全局类型声明
declare global {
  interface Date {
    getWeek(start?: number): [Date, Date];
  }
}

为什么要加类型声明?

TypeScript是基于类型系统工作的,它只认识内置的Date方法(比如getDay、setDate这些)。当你给原型扩展新方法时,必须通过declare global扩展全局的Date接口,这样TS才能知道这个方法的存在,以及它的参数和返回值类型。

这样处理之后,你的代码就能正常运行,而且TypeScript也不会再报错啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:16:12