function isValidDateValue(value: unknown): value is string | number | Date { if ( typeof value !== "string" && typeof value !== "number" && !(value instanceof Date) ) { return false; } return !Number.isNaN(new Date(value).getTime()); } const checkValueInIntervalRecursive = ( data: any, propName: string, startValue: number | Date, endValue: number | Date, ): boolean => { if (data === null || data === undefined) { return false; } const propPath = propName.split("."); let current = data; for (const segment of propPath) { if (current && typeof current === "object" && segment in current) { current = current[segment]; } else { return false; } } if (typeof current === "number") { if (typeof startValue === "number" && typeof endValue === "number") { if (startValue <= current && current <= endValue) { return true; } } } else if (isValidDateValue(current)) { const date = new Date(current); if (startValue instanceof Date && endValue instanceof Date) { if (startValue <= date && date <= endValue) { return true; } } } else { return false; } if (Array.isArray(data)) { return data.some((item) => checkValueInIntervalRecursive(item, propName, startValue, endValue), ); } if (typeof data === "object") { return Object.entries(data).some(([_key, value]) => checkValueInIntervalRecursive(value, propName, startValue, endValue), ); } return false; }; export default checkValueInIntervalRecursive;