export function isObjEqual(a: object, b: object): boolean { // Сравнение примитивов и null/undefined if (a === b) return true if (!a || !b) return false if (Object.keys(a).length !== Object.keys(b).length) return false // Получаем все уникальные ключи из обоих объектов const allKeys = new Set([ ...Object.keys(a), ...Object.keys(b) ]) // Проверяем каждое свойство for (const key of allKeys) { const valA = a[key as keyof typeof a] const valB = b[key as keyof typeof b] // Если одно из значений undefined - объекты разные if (valA === undefined || valB === undefined) return false // Рекурсивное сравнение для вложенных объектов if (typeof valA === 'object' && typeof valB === 'object') { if (!isObjEqual(valA, valB)) return false } // Сравнение примитивов else if (!Object.is(valA, valB)) { return false } } return true } export function parseIntString (s: string | string[] | undefined) :number | null { if (typeof s !== 'string') return null const regex = /^[+-]?\d+$/ return regex.test(s) ? Number(s) : null }