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

TypeScript中如何对Moment类型变量执行运算?

问题解答

为什么TypeScript里直接减Moment对象会报错?

在JavaScript中,Moment实例能执行减法运算,是因为它内部重写了valueOf()方法——当对对象执行算术操作时,JS会自动调用这个方法,返回对应时间的毫秒级时间戳(number类型),所以then - now本质是两个数字相减。

但TypeScript的类型检查器严格遵循类型规则:它只允许对any、number、bigint或枚举类型执行算术运算,而Moment类型不在这个范围内,因此会抛出类型错误。

不转any的解决办法

方法1:手动调用valueOf()获取时间戳

既然JS会自动调用valueOf(),我们可以显式调用它拿到数字,让TypeScript识别运算合法性:

import moment, { Moment } from "moment";

const now: Moment = moment();
const then: Moment = moment("2022-09-16 22:00:00", "YYYY-MM-DD hh:mm:ss");

// 显式获取毫秒时间戳再相减,得到的差值是毫秒数
const countdown: Moment = moment(then.valueOf() - now.valueOf());

注意:这里得到的countdown是基于Unix纪元(1970-01-01)加上差值后的时间,如果你的需求是计算时间差的时长,更推荐用下面的方法。

方法2:使用Moment原生的difference()方法

如果要计算两个时间的差值并处理成时长,用diff()配合moment.duration()会更清晰:

// 计算then和now的时间差(默认单位是毫秒)
const diffMs = then.diff(now);
// 转成Duration对象,方便获取天、小时、分钟等单位
const duration = moment.duration(diffMs);
console.log(duration.days(), duration.hours());

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 18:48:24