ajv/COERCION.md

2.8 KiB

Ajv type coercion rules

To enable type coercion pass option coerceTypes to ajv (it is false by default). See example.

The coercion rules are different from JavaScript:

  • to validate user input as expected
  • to have the coercion reversible
  • to correctly validate cases where different types are required in subschemas (e.g., in anyOf).

Type coercion only happens if there is type keyword and if without coercion the validation would have failed. If coercion to the required type succeeds then the validation continues to other keywords, otherwise the validation fails.

If there are multiple types allowed in type keyword the coercion will only happen if none of the types match the data and some of the scalar types are present (coercion to/from object/array is not possible). In this case the validating function will try coercing the data to each type in order until some of them succeeds.

Possible type coercions:

from type →
to type ↓
string number boolean null
string - x""+x false"false"
true"true"
null""
number /
integer
Valid number /
integer: x+x
- false0
true1
null0
boolean "false"false
"true"true
"abc"
""
0false
1true
x
- nullfalse
null ""null
"null"
"abc"
0null
x
falsenull
true
-

Coersion from string values

To number type

Coercion to number is possible if the string is a valid number, +data is used.

To integer type

Coercion to integer is possible if the string is a valid number without fractional part (data % 1 === 0).

To boolean type

Unlike JavaScript, only these strings can be coerced to boolean:

  • "true" -> true
  • "false" -> false

To null type

Empty string is coerced to null, other strings can't be coerced.

Coercion from number values

To string type

Always possible, '' + data is used

To boolean type

Unlike JavaScript, only these numbers can be coerced to boolean:

  • 1 -> true
  • 0 -> false

To null type

0 coerces to null, other numbers can't be coerced.

Coercion from boolean values

To string type

  • true -> "true"
  • false -> "false"

To number/integer types

  • true -> 1
  • false -> 0

To null type

false coerces to null, true can't be coerced.

Coercion from null

To string type

null coerses to the empty string.

To number/integer types

null coerces to 0

To boolean type

null coerces to false