diff --git a/packages/form-core/src/utils.ts b/packages/form-core/src/utils.ts index 71a6ddb69..0946c24bd 100644 --- a/packages/form-core/src/utils.ts +++ b/packages/form-core/src/utils.ts @@ -439,6 +439,13 @@ export function evaluate(objA: T, objB: T) { return objA.getTime() === objB.getTime() } + if ( + typeof (objA as any).equals === 'function' && + objA.constructor === objB.constructor + ) { + return (objA as any).equals(objB) + } + if (objA instanceof Map && objB instanceof Map) { if (objA.size !== objB.size) return false for (const [k, v] of objA) { diff --git a/packages/form-core/tests/utils.spec.ts b/packages/form-core/tests/utils.spec.ts index a545fd719..28bb80d45 100644 --- a/packages/form-core/tests/utils.spec.ts +++ b/packages/form-core/tests/utils.spec.ts @@ -693,6 +693,18 @@ describe('evaluate', () => { expect(dateObjectFalse).toEqual(false) }) + it('should test equality for objects with an equals() method (e.g. Temporal, Decimal.js)', () => { + class ValueType { + constructor(private val: number) {} + equals(other: ValueType) { + return this.val === other.val + } + } + + expect(evaluate(new ValueType(1), new ValueType(1))).toEqual(true) + expect(evaluate(new ValueType(1), new ValueType(2))).toEqual(false) + }) + it('should test equality between Map objects', () => { const map1 = new Map([ ['a', 1],