Skip to content

Commit

Permalink
Cherry-pick PR #38395 into release-3.9 (#38402)
Browse files Browse the repository at this point in the history
Component commits:
6fe4be2 Exclude arrays and tuples from full intersection property check

9019e39 Add regression test

Co-authored-by: Anders Hejlsberg <andersh@microsoft.com>
  • Loading branch information
DanielRosenwasser and ahejlsberg committed May 8, 2020
2 parents ef028bc + 9d6f126 commit 9edf9ec
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 1 deletion.
2 changes: 1 addition & 1 deletion src/compiler/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15827,7 +15827,7 @@ namespace ts {
// recursive intersections that are structurally similar but not exactly identical. See #37854.
if (result && !inPropertyCheck && (
target.flags & TypeFlags.Intersection && (isPerformingExcessPropertyChecks || isPerformingCommonPropertyChecks) ||
isNonGenericObjectType(target) && source.flags & TypeFlags.Intersection && getApparentType(source).flags & TypeFlags.StructuredType && !some((<IntersectionType>source).types, t => !!(getObjectFlags(t) & ObjectFlags.NonInferrableType)))) {
isNonGenericObjectType(target) && !isArrayType(target) && !isTupleType(target) && source.flags & TypeFlags.Intersection && getApparentType(source).flags & TypeFlags.StructuredType && !some((<IntersectionType>source).types, t => !!(getObjectFlags(t) & ObjectFlags.NonInferrableType)))) {
inPropertyCheck = true;
result &= recursiveTypeRelatedTo(source, target, reportErrors, IntersectionState.PropertyCheck);
inPropertyCheck = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,4 +46,9 @@ tests/cases/compiler/intersectionsAndOptionalProperties.ts(20,5): error TS2322:
~~~~~~~
!!! error TS2322: Type 'null' is not assignable to type 'number | undefined'.
}

// Repro from #38348

const yy: number[] & [number, ...number[]] = [1];
const xx: [number, ...number[]] = yy;

Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,11 @@ function foo(v: From) {
x = v; // Error
x.field = v.field; // Error
}

// Repro from #38348

const yy: number[] & [number, ...number[]] = [1];
const xx: [number, ...number[]] = yy;


//// [intersectionsAndOptionalProperties.js]
Expand All @@ -31,3 +36,6 @@ function foo(v) {
x = v; // Error
x.field = v.field; // Error
}
// Repro from #38348
var yy = [1];
var xx = yy;
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,12 @@ function foo(v: From) {
>field : Symbol(field, Decl(intersectionsAndOptionalProperties.ts, 14, 14))
}

// Repro from #38348

const yy: number[] & [number, ...number[]] = [1];
>yy : Symbol(yy, Decl(intersectionsAndOptionalProperties.ts, 24, 5))

const xx: [number, ...number[]] = yy;
>xx : Symbol(xx, Decl(intersectionsAndOptionalProperties.ts, 25, 5))
>yy : Symbol(yy, Decl(intersectionsAndOptionalProperties.ts, 24, 5))

11 changes: 11 additions & 0 deletions tests/baselines/reference/intersectionsAndOptionalProperties.types
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,14 @@ function foo(v: From) {
>field : null
}

// Repro from #38348

const yy: number[] & [number, ...number[]] = [1];
>yy : number[] & [number, ...number[]]
>[1] : [number]
>1 : 1

const xx: [number, ...number[]] = yy;
>xx : [number, ...number[]]
>yy : number[] & [number, ...number[]]

5 changes: 5 additions & 0 deletions tests/cases/compiler/intersectionsAndOptionalProperties.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,8 @@ function foo(v: From) {
x = v; // Error
x.field = v.field; // Error
}

// Repro from #38348

const yy: number[] & [number, ...number[]] = [1];
const xx: [number, ...number[]] = yy;

0 comments on commit 9edf9ec

Please sign in to comment.