1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
=== tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts ===
// Repro from #32657
interface Base<T> {
value: T;
>value : T
}
interface Int extends Base<number> {
type: "integer";
>type : "integer"
multipleOf?: number;
>multipleOf : number
}
interface Float extends Base<number> {
type: "number";
>type : "number"
}
interface Str extends Base<string> {
type: "string";
>type : "string"
format?: string;
>format : string
}
interface Bool extends Base<boolean> {
type: "boolean";
>type : "boolean"
}
type Primitive = Int | Float | Str | Bool;
>Primitive : Int | Float | Str | Bool
const foo: Primitive = {
>foo : Primitive
>{ type: "number", value: 10, multipleOf: 5, // excess property format: "what?"} : { type: "number"; value: number; multipleOf: number; format: string; }
type: "number",
>type : "number"
>"number" : "number"
value: 10,
>value : number
>10 : 10
multipleOf: 5, // excess property
>multipleOf : number
>5 : 5
format: "what?"
>format : string
>"what?" : "what?"
}
type DisjointDiscriminants = { p1: 'left'; p2: true; p3: number } | { p1: 'right'; p2: false; p4: string } | { p1: 'left'; p2: boolean };
>DisjointDiscriminants : { p1: 'left'; p2: true; p3: number; } | { p1: 'right'; p2: false; p4: string; } | { p1: 'left'; p2: boolean; }
>p1 : "left"
>p2 : true
>true : true
>p3 : number
>p1 : "right"
>p2 : false
>false : false
>p4 : string
>p1 : "left"
>p2 : boolean
// This has excess error because variant three is the only applicable case.
const a: DisjointDiscriminants = {
>a : DisjointDiscriminants
>{ p1: 'left', p2: false, p3: 42, p4: "hello"} : { p1: "left"; p2: false; p3: number; p4: string; }
p1: 'left',
>p1 : "left"
>'left' : "left"
p2: false,
>p2 : false
>false : false
p3: 42,
>p3 : number
>42 : 42
p4: "hello"
>p4 : string
>"hello" : "hello"
};
// This has no excess error because variant one and three are both applicable.
const b: DisjointDiscriminants = {
>b : DisjointDiscriminants
>{ p1: 'left', p2: true, p3: 42, p4: "hello"} : { p1: "left"; p2: true; p3: number; p4: string; }
p1: 'left',
>p1 : "left"
>'left' : "left"
p2: true,
>p2 : true
>true : true
p3: 42,
>p3 : number
>42 : 42
p4: "hello"
>p4 : string
>"hello" : "hello"
};
// This has excess error because variant two is the only applicable case
const c: DisjointDiscriminants = {
>c : DisjointDiscriminants
>{ p1: 'right', p2: false, p3: 42, p4: "hello"} : { p1: "right"; p2: false; p3: number; p4: string; }
p1: 'right',
>p1 : "right"
>'right' : "right"
p2: false,
>p2 : false
>false : false
p3: 42,
>p3 : number
>42 : 42
p4: "hello"
>p4 : string
>"hello" : "hello"
};
|