JSON IO

JSON.parse typed

Parse returns an unknown value, so assert the expected shape right away. The assertion documents intent and unlocks typed access below.

const raw: string = "{"port":3000}"; const config = JSON.parse(raw) as { port: number }; console.log(config.port);

The cast does not check the data, it only labels it. The next section adds a light check before trusting the label.

Pretty print

Two extra arguments turn dense JSON into readable text. Human-friendly output matters for files that users may open and edit.

const config = { port: 3000, mode: "dev" }; const text: string = JSON.stringify(config, null, 2); console.log(text);

pretty JSON with two space indent

Config file pattern

Config flow has three steps: read text, parse it, and label the shape. One helper keeps that flow in a single reviewed place.

import { readFileSync } from "node:fs"; function loadPort(path: string): number { const text: string = readFileSync(path, "utf8"); const data = JSON.parse(text) as { port: number }; return data.port; }

Validate shape simply

Disks hold surprises, from hand edits to half-written saves. Check the one field the program needs before using it.

function isPortConfig(value: unknown): boolean { if (typeof value !== "object" || value === null) { return false; } const port = (value as { port: unknown }).port; return typeof port === "number"; }

Return false for null, for non-objects, and for wrong field types. Callers then fall back to defaults instead of crashing later.

Next: Dates

Article author: Arthur Isaev