關於JavaScript/TypeScript中的setTimeout和setInterval
ypescript是強類型語言,定義setInterval()必須定義其返回值,但是你無論用百度或者谷歌搜中文也好英文也罷,都告訴你setInterval()的返回值類型是number,
如果你將setInterval()定義成number型,會告訴你不能將類型“Timeout”分配給類型“number”,但是如果定義成所謂的“Timeout”型,也就是“NodeJS.Timeout”型初期化又成了問題
那么要這么定義:
public timer: NodeJS.Timer | null = null;
但是不能完全照搬因為這么定義的話
clearInterval(timer)時參數類型會出問題,所以要將參數強制轉換成number型
也就是clearInterval(Number(timer))。
例:
數組只要含有 curTimes字段就創建一個定時器,多個定時器同時倒計時,若該時間大於當前時間則清楚該定時器
this.list.map((itemSec, indexSec) => { let _this = this; if (itemSec.curTimes) { itemSec.timer = setInterval(() => { var my_time: any = new Date(Number(itemSec.curTimes)).getTime(); var my_time2: any = new Date().getTime(); var mss: any = Number(itemSec.curTimes) - Number(my_time2); if (Number(my_time) - Number(my_time2) <= 0) { itemSec.timer && clearInterval(itemSec.timer); itemSec.currentHours = 0; itemSec.currentSecond = 0; itemSec.currentMinutes = 0; return; } var hours: any = Math.floor( (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60) ); var minutes: any = Math.floor( (mss % (1000 * 60 * 60)) / (1000 * 60) ); var seconds: any = Math.floor((mss % (1000 * 60)) / 1000); if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + Number(seconds); } else { seconds = Number(seconds); } itemSec.currentHours = hours; itemSec.currentSecond = seconds; itemSec.currentMinutes = minutes; }, 1000); } });