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
相关产品推荐
相关产品推荐

