diff --git a/src/index.ts b/src/index.ts index 22f9a7c..83d0fb9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -140,13 +140,14 @@ class Schema { let value = source[z]; arr.forEach(r => { let rule: InternalRuleItem = r; + let inferredType: RuleType; if (typeof rule.transform === 'function') { if (source === source_) { source = { ...source }; } value = source[z] = rule.transform(value); if (value !== undefined && value !== null) { - rule.type = rule.type || ((Array.isArray(value) ? 'array' : typeof value) as RuleType); + inferredType = (Array.isArray(value) ? 'array' : typeof value) as RuleType; } } if (typeof rule === 'function') { @@ -155,6 +156,9 @@ class Schema { }; } else { rule = { ...rule }; + if (inferredType) { + rule.type = rule.type || inferredType; + } } // Fill validator. Skip if nothing need to validate diff --git a/tests/number.spec.ts b/tests/number.spec.ts index fbb54e4..0aa32e5 100644 --- a/tests/number.spec.ts +++ b/tests/number.spec.ts @@ -148,6 +148,14 @@ describe('number', () => { done(); }); }); + it('reinfers transformed type across validations', async () => { + const schema = new Schema({ + v: { required: true, transform: value => value }, + }); + + await expect(schema.validate({ v: 1 })).resolves.toEqual({ v: 1 }); + await expect(schema.validate({ v: 'value' })).resolves.toEqual({ v: 'value' }); + }); it('transform array', done => { const value = { v: [0, 1] }; new Schema({