Exhaustive type checking is when your static compiler checks that youβre not leaving a possibility unchecked. Example with discriminated union: interface Square { kind: "square"; size: number; } interface Rectangle { kind: "rectangle"; width: number; height: number; } // Someone just added this new `Circle` Type // We would like to let TypeScript give an error at any place that *needs* to cater for this interface Circle { kind: "circle"; radius: number; } type Shape = Square | Rectangle | Circle; function area(s: Shape) { if (s.kind === "square") { return s.size * s.size; } else if (s.kind === "rectangle") { return s.width * s.height; } else { // ERROR : `Circle` is not assignable to `never` const _exhaustiveCheck: never = s; } }