How to Parse a number from a Query Parameter
Query parameters are represented as the type
Record<string, string | string[] | undefined>, so using a codec that doesn't decode
from a string | string[] | undefined will produce a type error.
Working Route
Consider this httpRoute that compiles successfully.
Compilation Error
If you add an expected number value to the httpRoute's query parameters, you'll see the following compilation error:
The error message looks like this:
index.ts:16:7 - error TS2322:
Codec's output type is not assignable to
string | string[] | undefined.
Try using one like `NumberFromString`
13 repeat: t.numberRecall that t.number decodes an unknown value into a number without any manipulation of the starting value. If you started with a number, you'll decode a number.
We need a codec that decodes a string into a number and converts the string-representation of a number into the number type.
Solution
This is a fairly common requirement, so this codec already exists: io-ts-types offers the NumberFromString codec that decodes a string value into a number. UseNumberFromString to fix your compilation error.
import * as t from 'io-ts';
import { httpRoute, httpRequest } from '@api-ts/io-ts-http';
const GetHello = httpRoute({
path: '/hello/{name}',
method: 'GET',
request: httpRequest({
params: {
name: t.string,
},
}), response: {
200: t.string,
},});
In general, the solution to decoding a query parameter into a non-string type is to use
a codec that decodes and encodes from a string into your desired type.