Disabling coercion

You can disable coercion for a whole structure or for attributes individually using the coercion option in the schema and attribute options, respectively. Notice that it will cause validation to fail when the passed value is not of the expected value:

Disabling for the whole structure

const User = attributes(
  {
    name: String,
    age: Number,
  },
  {
    coercion: false,
  }
)(class User {});

const user = new User({ name: 123, age: '42' });

user.name; // 123
user.age; // '42'

const { valid, errors } = user.validate();

valid; // false
errors; /*
[
  { message: '"name" must be a string', path: ['name'] },
  { message: '"age" must be a number', path: ['age'] }
]
*/

Disabling for specific attributes

const User = attributes({
  name: { type: String, coercion: false },
  age: Number,
})(class User {});

const user = new User({ name: 123, age: '42' });

user.name; // 123
user.age; // 42

const { valid, errors } = user.validate();

valid; // false
errors; /*
[
  { message: '"name" must be a string', path: ['name'] }
]
*/

Overwritting structure option with attribute option

If you define the coercion option both for the structure and for an attribute, the structure one will apply for the whole schema except the specific attributes that overwrite it:

const User = attributes(
  {
    name: { type: String, coercion: true },
    age: Number,
  },
  {
    coercion: false,
  }
)(class User {});

const user = new User({ name: 123, age: '42' });

user.name; // '123'
user.age; // '42'

const { valid, errors } = user.validate();

valid; // false
errors; /*
[
  { message: '"age" must be a number', path: ['age'] }
]
*/

Last updated