unknown vs any

Parse JSON safely.

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");