diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7bc999936e81c..6b5d57b9d144a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15816,7 +15816,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((source).types, t => !!(getObjectFlags(t) & ObjectFlags.NonInferrableType)))) { + isNonGenericObjectType(target) && !isArrayType(target) && !isTupleType(target) && source.flags & TypeFlags.Intersection && getApparentType(source).flags & TypeFlags.StructuredType && !some((source).types, t => !!(getObjectFlags(t) & ObjectFlags.NonInferrableType)))) { inPropertyCheck = true; result &= recursiveTypeRelatedTo(source, target, reportErrors, IntersectionState.PropertyCheck); inPropertyCheck = false; diff --git a/tests/baselines/reference/intersectionsAndOptionalProperties.errors.txt b/tests/baselines/reference/intersectionsAndOptionalProperties.errors.txt index bcd0a6f841d88..faa8b067b1ac3 100644 --- a/tests/baselines/reference/intersectionsAndOptionalProperties.errors.txt +++ b/tests/baselines/reference/intersectionsAndOptionalProperties.errors.txt @@ -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; \ No newline at end of file diff --git a/tests/baselines/reference/intersectionsAndOptionalProperties.js b/tests/baselines/reference/intersectionsAndOptionalProperties.js index b2f13a9f67955..5bb0df9d27f3f 100644 --- a/tests/baselines/reference/intersectionsAndOptionalProperties.js +++ b/tests/baselines/reference/intersectionsAndOptionalProperties.js @@ -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] @@ -31,3 +36,6 @@ function foo(v) { x = v; // Error x.field = v.field; // Error } +// Repro from #38348 +var yy = [1]; +var xx = yy; diff --git a/tests/baselines/reference/intersectionsAndOptionalProperties.symbols b/tests/baselines/reference/intersectionsAndOptionalProperties.symbols index c5504794e6ea5..e09f4dce5bbbd 100644 --- a/tests/baselines/reference/intersectionsAndOptionalProperties.symbols +++ b/tests/baselines/reference/intersectionsAndOptionalProperties.symbols @@ -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)) + diff --git a/tests/baselines/reference/intersectionsAndOptionalProperties.types b/tests/baselines/reference/intersectionsAndOptionalProperties.types index 7f5af60c18e6f..98bc85c7e4299 100644 --- a/tests/baselines/reference/intersectionsAndOptionalProperties.types +++ b/tests/baselines/reference/intersectionsAndOptionalProperties.types @@ -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[]] + diff --git a/tests/cases/compiler/intersectionsAndOptionalProperties.ts b/tests/cases/compiler/intersectionsAndOptionalProperties.ts index a5bc4a1580af4..9878604c1483a 100644 --- a/tests/cases/compiler/intersectionsAndOptionalProperties.ts +++ b/tests/cases/compiler/intersectionsAndOptionalProperties.ts @@ -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;