From a3b8ad22ebd56deec43eb07b193ed832d0a146b7 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 1 Feb 2021 18:01:08 -0800 Subject: [PATCH] Accepted baselines. --- .../contextualTypeShouldBeLiteral.errors.txt | 130 ++++++++++++++++++ ...yCheckWithMultipleDiscriminants.errors.txt | 7 +- .../excessPropertyCheckWithUnions.errors.txt | 45 +++--- .../objectLiteralNormalization.errors.txt | 5 +- 4 files changed, 163 insertions(+), 24 deletions(-) create mode 100644 tests/baselines/reference/contextualTypeShouldBeLiteral.errors.txt diff --git a/tests/baselines/reference/contextualTypeShouldBeLiteral.errors.txt b/tests/baselines/reference/contextualTypeShouldBeLiteral.errors.txt new file mode 100644 index 00000000000..3418c3ada4a --- /dev/null +++ b/tests/baselines/reference/contextualTypeShouldBeLiteral.errors.txt @@ -0,0 +1,130 @@ +tests/cases/compiler/contextualTypeShouldBeLiteral.ts(40,5): error TS2345: Argument of type '{ type2: "y"; value: "done"; method(): void; }' is not assignable to parameter of type 'X2 | Y2'. + Object literal may only specify known properties, but 'type2' does not exist in type 'X2'. Did you mean to write 'type1'? + + +==== tests/cases/compiler/contextualTypeShouldBeLiteral.ts (1 errors) ==== + interface X { + type: 'x'; + value: string; + method(): void; + } + + interface Y { + type: 'y'; + value: 'none' | 'done'; + method(): void; + } + + function foo(bar: X | Y) { } + + foo({ + type: 'y', + value: 'done', + method() { + this; + this.type; + this.value; + } + }); + + interface X2 { + type1: 'x'; + value: string; + method(): void; + } + + interface Y2 { + type2: 'y'; + value: 'none' | 'done'; + method(): void; + } + + function foo2(bar: X2 | Y2) { } + + foo2({ + type2: 'y', + ~~~~~~~~~~ +!!! error TS2345: Argument of type '{ type2: "y"; value: "done"; method(): void; }' is not assignable to parameter of type 'X2 | Y2'. +!!! error TS2345: Object literal may only specify known properties, but 'type2' does not exist in type 'X2'. Did you mean to write 'type1'? + value: 'done', + method() { + this; + this.value; + } + }); + + interface X3 { + type: 'x'; + value: 1 | 2 | 3; + xtra: number; + } + + interface Y3 { + type: 'y'; + value: 11 | 12 | 13; + ytra: number; + } + + let xy: X3 | Y3 = { + type: 'y', + value: 11, + ytra: 12 + }; + + xy; + + + interface LikeA { + x: 'x'; + y: 'y'; + value: string; + method(): void; + } + + interface LikeB { + x: 'xx'; + y: 'yy'; + value: number; + method(): void; + } + + let xyz: LikeA | LikeB = { + x: 'x', + y: 'y', + value: "foo", + method() { + this; + this.x; + this.y; + this.value; + } + }; + + xyz; + + // Repro from #29168 + + interface TestObject { + type?: 'object'; + items: { + [k: string]: TestGeneric; + }; + } + + interface TestString { + type: 'string'; + } + + type TestGeneric = (TestString | TestObject) & { [k: string]: any; }; + + const test: TestGeneric = { + items: { + hello: { type: 'string' }, + world: { + items: { + nested: { type: 'string' } + } + } + } + }; + \ No newline at end of file diff --git a/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.errors.txt b/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.errors.txt index 29575580e80..341f41d9f37 100644 --- a/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.errors.txt +++ b/tests/baselines/reference/excessPropertyCheckWithMultipleDiscriminants.errors.txt @@ -2,11 +2,13 @@ tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts(30,5): erro Object literal may only specify known properties, and 'multipleOf' does not exist in type 'Float'. tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts(41,5): error TS2322: Type '{ p1: "left"; p2: false; p3: number; p4: string; }' is not assignable to type 'DisjointDiscriminants'. Object literal may only specify known properties, and 'p3' does not exist in type '{ p1: "left"; p2: boolean; }'. +tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts(50,5): error TS2322: Type '{ p1: "left"; p2: true; p3: number; p4: string; }' is not assignable to type 'DisjointDiscriminants'. + Object literal may only specify known properties, and 'p4' does not exist in type '{ p1: "left"; p2: true; p3: number; }'. tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts(57,5): error TS2322: Type '{ p1: "right"; p2: false; p3: number; p4: string; }' is not assignable to type 'DisjointDiscriminants'. Object literal may only specify known properties, and 'p3' does not exist in type '{ p1: "right"; p2: false; p4: string; }'. -==== tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts (3 errors) ==== +==== tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts (4 errors) ==== // Repro from #32657 interface Base { @@ -63,6 +65,9 @@ tests/cases/compiler/excessPropertyCheckWithMultipleDiscriminants.ts(57,5): erro p2: true, p3: 42, p4: "hello" + ~~~~~~~~~~~ +!!! error TS2322: Type '{ p1: "left"; p2: true; p3: number; p4: string; }' is not assignable to type 'DisjointDiscriminants'. +!!! error TS2322: Object literal may only specify known properties, and 'p4' does not exist in type '{ p1: "left"; p2: true; p3: number; }'. }; // This has excess error because variant two is the only applicable case diff --git a/tests/baselines/reference/excessPropertyCheckWithUnions.errors.txt b/tests/baselines/reference/excessPropertyCheckWithUnions.errors.txt index 8c34a0f5d69..c4991fddad5 100644 --- a/tests/baselines/reference/excessPropertyCheckWithUnions.errors.txt +++ b/tests/baselines/reference/excessPropertyCheckWithUnions.errors.txt @@ -4,18 +4,18 @@ tests/cases/compiler/excessPropertyCheckWithUnions.ts(11,21): error TS2322: Type Object literal may only specify known properties, and 'd20' does not exist in type '{ tag: "A"; a1: string; }'. tests/cases/compiler/excessPropertyCheckWithUnions.ts(12,1): error TS2322: Type '{ tag: "D"; }' is not assignable to type 'ADT'. Property 'd20' is missing in type '{ tag: "D"; }' but required in type '{ tag: "D"; d20: 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20; }'. +tests/cases/compiler/excessPropertyCheckWithUnions.ts(29,19): error TS2322: Type '{ tag: "A"; y: number; }' is not assignable to type 'Ambiguous'. + Object literal may only specify known properties, and 'y' does not exist in type '{ tag: "A"; x: string; }'. +tests/cases/compiler/excessPropertyCheckWithUnions.ts(30,28): error TS2322: Type '{ tag: "A"; x: string; y: number; }' is not assignable to type 'Ambiguous'. + Object literal may only specify known properties, and 'y' does not exist in type '{ tag: "A"; x: string; }'. tests/cases/compiler/excessPropertyCheckWithUnions.ts(33,28): error TS2322: Type '{ tag: "A"; x: string; extra: number; }' is not assignable to type 'Ambiguous'. - Object literal may only specify known properties, and 'extra' does not exist in type 'Ambiguous'. -tests/cases/compiler/excessPropertyCheckWithUnions.ts(34,26): error TS2322: Type '{ tag: "A"; y: number; extra: number; }' is not assignable to type 'Ambiguous'. - Object literal may only specify known properties, and 'extra' does not exist in type 'Ambiguous'. + Object literal may only specify known properties, and 'extra' does not exist in type '{ tag: "A"; x: string; }'. +tests/cases/compiler/excessPropertyCheckWithUnions.ts(34,19): error TS2322: Type '{ tag: "A"; y: number; extra: number; }' is not assignable to type 'Ambiguous'. + Object literal may only specify known properties, and 'y' does not exist in type '{ tag: "A"; x: string; }'. tests/cases/compiler/excessPropertyCheckWithUnions.ts(39,1): error TS2322: Type '{ tag: "A"; }' is not assignable to type 'Ambiguous'. - Type '{ tag: "A"; }' is not assignable to type '{ tag: "C"; }'. - Types of property 'tag' are incompatible. - Type '"A"' is not assignable to type '"C"'. -tests/cases/compiler/excessPropertyCheckWithUnions.ts(40,1): error TS2322: Type '{ tag: "A"; z: true; }' is not assignable to type 'Ambiguous'. - Type '{ tag: "A"; z: true; }' is not assignable to type '{ tag: "B"; z: boolean; }'. - Types of property 'tag' are incompatible. - Type '"A"' is not assignable to type '"B"'. + Property 'x' is missing in type '{ tag: "A"; }' but required in type '{ tag: "A"; x: string; }'. +tests/cases/compiler/excessPropertyCheckWithUnions.ts(40,19): error TS2322: Type '{ tag: "A"; z: true; }' is not assignable to type 'Ambiguous'. + Object literal may only specify known properties, and 'z' does not exist in type '{ tag: "A"; x: string; }'. tests/cases/compiler/excessPropertyCheckWithUnions.ts(49,35): error TS2322: Type '{ a: 1; b: 1; first: string; second: string; }' is not assignable to type 'Overlapping'. Object literal may only specify known properties, and 'second' does not exist in type '{ a: 1; b: 1; first: string; }'. tests/cases/compiler/excessPropertyCheckWithUnions.ts(50,35): error TS2322: Type '{ a: 1; b: 1; first: string; third: string; }' is not assignable to type 'Overlapping'. @@ -31,7 +31,7 @@ tests/cases/compiler/excessPropertyCheckWithUnions.ts(113,67): error TS2322: Typ tests/cases/compiler/excessPropertyCheckWithUnions.ts(114,63): error TS2322: Type 'string' is not assignable to type 'number'. -==== tests/cases/compiler/excessPropertyCheckWithUnions.ts (14 errors) ==== +==== tests/cases/compiler/excessPropertyCheckWithUnions.ts (16 errors) ==== type ADT = { tag: "A", a1: string @@ -71,17 +71,23 @@ tests/cases/compiler/excessPropertyCheckWithUnions.ts(114,63): error TS2322: Typ // no error for ambiguous tag, even when it could satisfy both constituents at once amb = { tag: "A", x: "hi" } amb = { tag: "A", y: 12 } + ~~~~~ +!!! error TS2322: Type '{ tag: "A"; y: number; }' is not assignable to type 'Ambiguous'. +!!! error TS2322: Object literal may only specify known properties, and 'y' does not exist in type '{ tag: "A"; x: string; }'. amb = { tag: "A", x: "hi", y: 12 } + ~~~~~ +!!! error TS2322: Type '{ tag: "A"; x: string; y: number; }' is not assignable to type 'Ambiguous'. +!!! error TS2322: Object literal may only specify known properties, and 'y' does not exist in type '{ tag: "A"; x: string; }'. // correctly error on excess property 'extra', even when ambiguous amb = { tag: "A", x: "hi", extra: 12 } ~~~~~~~~~ !!! error TS2322: Type '{ tag: "A"; x: string; extra: number; }' is not assignable to type 'Ambiguous'. -!!! error TS2322: Object literal may only specify known properties, and 'extra' does not exist in type 'Ambiguous'. +!!! error TS2322: Object literal may only specify known properties, and 'extra' does not exist in type '{ tag: "A"; x: string; }'. amb = { tag: "A", y: 12, extra: 12 } - ~~~~~~~~~ + ~~~~~ !!! error TS2322: Type '{ tag: "A"; y: number; extra: number; }' is not assignable to type 'Ambiguous'. -!!! error TS2322: Object literal may only specify known properties, and 'extra' does not exist in type 'Ambiguous'. +!!! error TS2322: Object literal may only specify known properties, and 'y' does not exist in type '{ tag: "A"; x: string; }'. // assignability errors still work. // But note that the error for `z: true` is the fallback one of reporting on @@ -89,15 +95,12 @@ tests/cases/compiler/excessPropertyCheckWithUnions.ts(114,63): error TS2322: Typ amb = { tag: "A" } ~~~ !!! error TS2322: Type '{ tag: "A"; }' is not assignable to type 'Ambiguous'. -!!! error TS2322: Type '{ tag: "A"; }' is not assignable to type '{ tag: "C"; }'. -!!! error TS2322: Types of property 'tag' are incompatible. -!!! error TS2322: Type '"A"' is not assignable to type '"C"'. +!!! error TS2322: Property 'x' is missing in type '{ tag: "A"; }' but required in type '{ tag: "A"; x: string; }'. +!!! related TS2728 tests/cases/compiler/excessPropertyCheckWithUnions.ts:16:5: 'x' is declared here. amb = { tag: "A", z: true } - ~~~ + ~~~~~~~ !!! error TS2322: Type '{ tag: "A"; z: true; }' is not assignable to type 'Ambiguous'. -!!! error TS2322: Type '{ tag: "A"; z: true; }' is not assignable to type '{ tag: "B"; z: boolean; }'. -!!! error TS2322: Types of property 'tag' are incompatible. -!!! error TS2322: Type '"A"' is not assignable to type '"B"'. +!!! error TS2322: Object literal may only specify known properties, and 'z' does not exist in type '{ tag: "A"; x: string; }'. type Overlapping = | { a: 1, b: 1, first: string } diff --git a/tests/baselines/reference/objectLiteralNormalization.errors.txt b/tests/baselines/reference/objectLiteralNormalization.errors.txt index bd14787178b..ffa7ebf580f 100644 --- a/tests/baselines/reference/objectLiteralNormalization.errors.txt +++ b/tests/baselines/reference/objectLiteralNormalization.errors.txt @@ -1,6 +1,6 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralNormalization.ts(7,14): error TS2322: Type 'number' is not assignable to type 'string | undefined'. tests/cases/conformance/expressions/objectLiterals/objectLiteralNormalization.ts(8,1): error TS2322: Type '{ b: string; }' is not assignable to type '{ a: number; b?: undefined; c?: undefined; } | { a: number; b: string; c?: undefined; } | { a: number; b: string; c: boolean; }'. - Type '{ b: string; }' is missing the following properties from type '{ a: number; b: string; c: boolean; }': a, c + Property 'a' is missing in type '{ b: string; }' but required in type '{ a: number; b: string; c?: undefined; }'. tests/cases/conformance/expressions/objectLiterals/objectLiteralNormalization.ts(9,1): error TS2322: Type '{ c: true; }' is not assignable to type '{ a: number; b?: undefined; c?: undefined; } | { a: number; b: string; c?: undefined; } | { a: number; b: string; c: boolean; }'. Type '{ c: true; }' is missing the following properties from type '{ a: number; b: string; c: boolean; }': a, b tests/cases/conformance/expressions/objectLiterals/objectLiteralNormalization.ts(17,1): error TS2322: Type '{ a: string; b: number; }' is not assignable to type '{ a: number; b: number; } | { a: string; b?: undefined; } | { a?: undefined; b?: undefined; }'. @@ -27,7 +27,8 @@ tests/cases/conformance/expressions/objectLiterals/objectLiteralNormalization.ts a1 = { b: "y" }; // Error ~~ !!! error TS2322: Type '{ b: string; }' is not assignable to type '{ a: number; b?: undefined; c?: undefined; } | { a: number; b: string; c?: undefined; } | { a: number; b: string; c: boolean; }'. -!!! error TS2322: Type '{ b: string; }' is missing the following properties from type '{ a: number; b: string; c: boolean; }': a, c +!!! error TS2322: Property 'a' is missing in type '{ b: string; }' but required in type '{ a: number; b: string; c?: undefined; }'. +!!! related TS2728 tests/cases/conformance/expressions/objectLiterals/objectLiteralNormalization.ts:2:23: 'a' is declared here. a1 = { c: true }; // Error ~~ !!! error TS2322: Type '{ c: true; }' is not assignable to type '{ a: number; b?: undefined; c?: undefined; } | { a: number; b: string; c?: undefined; } | { a: number; b: string; c: boolean; }'.