Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Check nested weak types in intersections on target side of relation (#…
…51140) * Check nested weak types in intersections on target side of relation * Add regression tests * Move logic from isRelatedTo to structuredTypeRelatedTo * Fix lint error * Add additional test
- Loading branch information
1 parent
9f49f9c
commit 37317a2
Showing
6 changed files
with
431 additions
and
37 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
70 changes: 70 additions & 0 deletions
70
tests/baselines/reference/nestedExcessPropertyChecking.errors.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
tests/cases/compiler/nestedExcessPropertyChecking.ts(6,7): error TS2322: Type 'C1' is not assignable to type 'A1 & B1'. | ||
Types of property 'x' are incompatible. | ||
Type '{ c: string; }' has no properties in common with type '{ a?: string | undefined; } & { b?: string | undefined; }'. | ||
tests/cases/compiler/nestedExcessPropertyChecking.ts(13,7): error TS2559: Type 'C2' has no properties in common with type 'A2 & B2'. | ||
tests/cases/compiler/nestedExcessPropertyChecking.ts(17,5): error TS2559: Type 'E' has no properties in common with type '{ nope?: any; }'. | ||
tests/cases/compiler/nestedExcessPropertyChecking.ts(18,5): error TS2559: Type '"A"' has no properties in common with type '{ nope?: any; }'. | ||
tests/cases/compiler/nestedExcessPropertyChecking.ts(30,22): error TS2559: Type 'false' has no properties in common with type 'OverridesInput'. | ||
tests/cases/compiler/nestedExcessPropertyChecking.ts(40,9): error TS2559: Type 'false' has no properties in common with type 'OverridesInput'. | ||
|
||
|
||
==== tests/cases/compiler/nestedExcessPropertyChecking.ts (6 errors) ==== | ||
type A1 = { x: { a?: string } }; | ||
type B1 = { x: { b?: string } }; | ||
|
||
type C1 = { x: { c: string } }; | ||
|
||
const ab1: A1 & B1 = {} as C1; // Error | ||
~~~ | ||
!!! error TS2322: Type 'C1' is not assignable to type 'A1 & B1'. | ||
!!! error TS2322: Types of property 'x' are incompatible. | ||
!!! error TS2322: Type '{ c: string; }' has no properties in common with type '{ a?: string | undefined; } & { b?: string | undefined; }'. | ||
|
||
type A2 = { a?: string }; | ||
type B2 = { b?: string }; | ||
|
||
type C2 = { c: string }; | ||
|
||
const ab2: A2 & B2 = {} as C2; // Error | ||
~~~ | ||
!!! error TS2559: Type 'C2' has no properties in common with type 'A2 & B2'. | ||
|
||
enum E { A = "A" } | ||
|
||
let x: { nope?: any } = E.A; // Error | ||
~ | ||
!!! error TS2559: Type 'E' has no properties in common with type '{ nope?: any; }'. | ||
let y: { nope?: any } = "A"; // Error | ||
~ | ||
!!! error TS2559: Type '"A"' has no properties in common with type '{ nope?: any; }'. | ||
|
||
// Repros from #51043 | ||
|
||
type OverridesInput = { | ||
someProp?: 'A' | 'B' | ||
} | ||
|
||
const foo1: Partial<{ something: any }> & { variables: { | ||
overrides?: OverridesInput; | ||
} & Partial<{ | ||
overrides?: OverridesInput; | ||
}>} = { variables: { overrides: false } }; // Error | ||
~~~~~~~~~ | ||
!!! error TS2559: Type 'false' has no properties in common with type 'OverridesInput'. | ||
!!! related TS6500 tests/cases/compiler/nestedExcessPropertyChecking.ts:27:5: The expected type comes from property 'overrides' which is declared here on type '{ overrides?: OverridesInput | undefined; } & Partial<{ overrides?: OverridesInput | undefined; }>' | ||
|
||
|
||
interface Unrelated { _?: any } | ||
|
||
interface VariablesA { overrides?: OverridesInput; } | ||
interface VariablesB { overrides?: OverridesInput; } | ||
|
||
const foo2: Unrelated & { variables: VariablesA & VariablesB } = { | ||
variables: { | ||
overrides: false // Error | ||
~~~~~~~~~ | ||
!!! error TS2559: Type 'false' has no properties in common with type 'OverridesInput'. | ||
!!! related TS6500 tests/cases/compiler/nestedExcessPropertyChecking.ts:35:24: The expected type comes from property 'overrides' which is declared here on type 'VariablesA & VariablesB' | ||
} | ||
}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
//// [nestedExcessPropertyChecking.ts] | ||
type A1 = { x: { a?: string } }; | ||
type B1 = { x: { b?: string } }; | ||
|
||
type C1 = { x: { c: string } }; | ||
|
||
const ab1: A1 & B1 = {} as C1; // Error | ||
|
||
type A2 = { a?: string }; | ||
type B2 = { b?: string }; | ||
|
||
type C2 = { c: string }; | ||
|
||
const ab2: A2 & B2 = {} as C2; // Error | ||
|
||
enum E { A = "A" } | ||
|
||
let x: { nope?: any } = E.A; // Error | ||
let y: { nope?: any } = "A"; // Error | ||
|
||
// Repros from #51043 | ||
|
||
type OverridesInput = { | ||
someProp?: 'A' | 'B' | ||
} | ||
|
||
const foo1: Partial<{ something: any }> & { variables: { | ||
overrides?: OverridesInput; | ||
} & Partial<{ | ||
overrides?: OverridesInput; | ||
}>} = { variables: { overrides: false } }; // Error | ||
|
||
|
||
interface Unrelated { _?: any } | ||
|
||
interface VariablesA { overrides?: OverridesInput; } | ||
interface VariablesB { overrides?: OverridesInput; } | ||
|
||
const foo2: Unrelated & { variables: VariablesA & VariablesB } = { | ||
variables: { | ||
overrides: false // Error | ||
} | ||
}; | ||
|
||
|
||
//// [nestedExcessPropertyChecking.js] | ||
"use strict"; | ||
var ab1 = {}; // Error | ||
var ab2 = {}; // Error | ||
var E; | ||
(function (E) { | ||
E["A"] = "A"; | ||
})(E || (E = {})); | ||
var x = E.A; // Error | ||
var y = "A"; // Error | ||
var foo1 = { variables: { overrides: false } }; // Error | ||
var foo2 = { | ||
variables: { | ||
overrides: false // Error | ||
} | ||
}; |
Oops, something went wrong.