unknown is safe until you narrow. any skips checking — avoid it.
Goal
Parse JSON as unknown and log city.
const raw: unknown = JSON.parse('{"city":"Nairobi","units":12}');
if (
typeof raw === "object" &&
raw !== null &&
"city" in raw &&
typeof (raw as { city: unknown }).city === "string"
) {
console.log((raw as { city: string }).city);
}function asSale(raw: unknown): { city: string; units: number } {
if (typeof raw !== "object" || raw === null) throw new Error("not object");
const city = (raw as { city?: unknown }).city;
const units = (raw as { units?: unknown }).units;
if (typeof city !== "string" || typeof units !== "number") {
throw new Error("bad sale");
}
return { city, units };
}
console.log(asSale({ city: "Mombasa", units: 8 }));const n: unknown = 5;
if (typeof n === "number") {
console.log(n + 1);
}console.log("prefer unknown over any");