Skip to content

coerce ​

Type coercion for data that comes as strings: query parameters, FormData, environment variables, CSV.

Signature ​

ts
coerce.string(msg?: Message): Schema<string>
coerce.number(msg?: Message): Schema<number>
coerce.boolean(msg?: Message): Schema<boolean>
coerce.date(msg?: Message): Schema<Date>

Parameters ​

ParameterTypeDescription
msgMessageCustom message. Replaces the default messages for all errors of this schema

Conversions ​

FunctionConversionThen validated as
coerce.string()number, boolean, bigint → String(value)string()
coerce.number()string → trim → Number(value). An empty string stays emptynumber()
coerce.boolean()'true', '1', 'on', 'yes', 1 → true; 'false', '0', 'off', 'no', 0 → false. Case-insensitiveboolean()
coerce.date()a non-empty string or a number → new Date(value)date()

Values that already have the right type are not changed. Unsuitable values give a regular type error: coerce.number() on 'abc' → Must be a number.

Error codes ​

The same as the corresponding schema: required and string / number / boolean / date.

Examples ​

Query parameters ​

ts
// GET /products?page=2&limit=20&inStock=1
const Query = object({
  page: optional(pipe(coerce.number(), integer(), min(1)), 1),
  limit: optional(pipe(coerce.number(), integer(), max(100)), 20),
  inStock: optional(coerce.boolean(), false),
});

parse(Query, req.query); // { page: 2, limit: 20, inStock: true }

FormData ​

ts
const data = validate(Form, Object.fromEntries(new FormData(form)));

See also ​