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.
Code
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()));
}Report a problem with this exampleOpens a pre-filled issue on GitHub.