// Repro from #32657 interface Base { value: T; } interface Int extends Base { type: "integer"; multipleOf?: number; } interface Float extends Base { type: "number"; } interface Str extends Base { type: "string"; format?: string; } interface Bool extends Base { type: "boolean"; } type Primitive = Int | Float | Str | Bool; const foo: Primitive = { type: "number", value: 10, multipleOf: 5, // excess property format: "what?" } type DisjointDiscriminants = { p1: 'left'; p2: true; p3: number } | { p1: 'right'; p2: false; p4: string } | { p1: 'left'; p2: boolean }; // This has excess error because variant three is the only applicable case. const a: DisjointDiscriminants = { p1: 'left', p2: false, p3: 42, p4: "hello" }; // This has no excess error because variant one and three are both applicable. const b: DisjointDiscriminants = { p1: 'left', p2: true, p3: 42, p4: "hello" }; // This has excess error because variant two is the only applicable case const c: DisjointDiscriminants = { p1: 'right', p2: false, p3: 42, p4: "hello" };