User-Defined Type Guards

Write predicate functions that narrow unknown values to concrete types, turning runtime checks into compile-time guarantees at the call site.

TypescriptData Integrity

Code

snippet
export function isString(value: unknown): value is string {
  return typeof value === "string";
}

export function isRecord(value: unknown): value is Record<string, unknown> {
  return typeof value === "object" && value !== null && !Array.isArray(value);
}

export function isArrayOf<T>(
  value: unknown,
  guard: (item: unknown) => item is T,
): value is T[] {
  return Array.isArray(value) && value.every(guard);
}

export function assertNever(value: never): never {
  throw new Error("unexpected value " + String(value));
}

const input: unknown = JSON.parse("[\"a\", \"b\"]");
if (isArrayOf(input, isString)) {
  console.log(input.map((s) => s.toUpperCase()));
}