The difference between object, exact, and inexact
The three decoders in the “object” family of decoders—object(), exact() and inexact()—are very similar and only differ in how they treat extra properties on input values.
For example, for a definition like:
import { exact, inexact, number, object, string } from 'decoders';
const thing = { a: string, b: number };
And a runtime input of:
{
a: "hi",
b: 42,
c: "extra", // Note "c" is not a known field
}
| Extra properties | Output value | Inferred type | |
|---|---|---|---|
object(thing) | discarded | {a: "hi", b: 42} | {a: string, b: number} |
exact(thing) | not allowed | n/a (rejected) | {a: string, b: number} |
inexact(thing) | retained | {a: "hi", b: 42, c: "extra"} | {a: string, b: number, [string]: unknown} |