Skip to content

Commit dc53901

Browse files
committed
fix(form-core): use equals() for value-type equality (Temporal, Decimal.js)
1 parent 6a73479 commit dc53901

2 files changed

Lines changed: 19 additions & 0 deletions

File tree

packages/form-core/src/utils.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,13 @@ export function evaluate<T>(objA: T, objB: T) {
498498
return objA.getTime() === objB.getTime()
499499
}
500500

501+
if (
502+
typeof (objA as any).equals === 'function' &&
503+
objA.constructor === objB.constructor
504+
) {
505+
return (objA as any).equals(objB)
506+
}
507+
501508
if (objA instanceof Map && objB instanceof Map) {
502509
if (objA.size !== objB.size) return false
503510
for (const [k, v] of objA) {

packages/form-core/tests/utils.spec.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -747,6 +747,18 @@ describe('evaluate', () => {
747747
expect(dateObjectFalse).toEqual(false)
748748
})
749749

750+
it('should test equality for objects with an equals() method (e.g. Temporal, Decimal.js)', () => {
751+
class ValueType {
752+
constructor(private val: number) {}
753+
equals(other: ValueType) {
754+
return this.val === other.val
755+
}
756+
}
757+
758+
expect(evaluate(new ValueType(1), new ValueType(1))).toEqual(true)
759+
expect(evaluate(new ValueType(1), new ValueType(2))).toEqual(false)
760+
})
761+
750762
it('should test equality between Map objects', () => {
751763
const map1 = new Map([
752764
['a', 1],

0 commit comments

Comments
 (0)