Skip to content

Commit 9edf9ec

Browse files
Cherry-pick PR #38395 into release-3.9 (#38402)
Component commits: 6fe4be2 Exclude arrays and tuples from full intersection property check 9019e39 Add regression test Co-authored-by: Anders Hejlsberg <andersh@microsoft.com>
2 parents ef028bc + 9d6f126 commit 9edf9ec

6 files changed

+39
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15827,7 +15827,7 @@ namespace ts {
1582715827
// recursive intersections that are structurally similar but not exactly identical. See #37854.
1582815828
if (result && !inPropertyCheck && (
1582915829
target.flags & TypeFlags.Intersection && (isPerformingExcessPropertyChecks || isPerformingCommonPropertyChecks) ||
15830-
isNonGenericObjectType(target) && source.flags & TypeFlags.Intersection && getApparentType(source).flags & TypeFlags.StructuredType && !some((<IntersectionType>source).types, t => !!(getObjectFlags(t) & ObjectFlags.NonInferrableType)))) {
15830+
isNonGenericObjectType(target) && !isArrayType(target) && !isTupleType(target) && source.flags & TypeFlags.Intersection && getApparentType(source).flags & TypeFlags.StructuredType && !some((<IntersectionType>source).types, t => !!(getObjectFlags(t) & ObjectFlags.NonInferrableType)))) {
1583115831
inPropertyCheck = true;
1583215832
result &= recursiveTypeRelatedTo(source, target, reportErrors, IntersectionState.PropertyCheck);
1583315833
inPropertyCheck = false;

tests/baselines/reference/intersectionsAndOptionalProperties.errors.txt

+5
Original file line numberDiff line numberDiff line change
@@ -46,4 +46,9 @@ tests/cases/compiler/intersectionsAndOptionalProperties.ts(20,5): error TS2322:
4646
~~~~~~~
4747
!!! error TS2322: Type 'null' is not assignable to type 'number | undefined'.
4848
}
49+
50+
// Repro from #38348
51+
52+
const yy: number[] & [number, ...number[]] = [1];
53+
const xx: [number, ...number[]] = yy;
4954

tests/baselines/reference/intersectionsAndOptionalProperties.js

+8
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ function foo(v: From) {
2020
x = v; // Error
2121
x.field = v.field; // Error
2222
}
23+
24+
// Repro from #38348
25+
26+
const yy: number[] & [number, ...number[]] = [1];
27+
const xx: [number, ...number[]] = yy;
2328

2429

2530
//// [intersectionsAndOptionalProperties.js]
@@ -31,3 +36,6 @@ function foo(v) {
3136
x = v; // Error
3237
x.field = v.field; // Error
3338
}
39+
// Repro from #38348
40+
var yy = [1];
41+
var xx = yy;

tests/baselines/reference/intersectionsAndOptionalProperties.symbols

+9
Original file line numberDiff line numberDiff line change
@@ -62,3 +62,12 @@ function foo(v: From) {
6262
>field : Symbol(field, Decl(intersectionsAndOptionalProperties.ts, 14, 14))
6363
}
6464

65+
// Repro from #38348
66+
67+
const yy: number[] & [number, ...number[]] = [1];
68+
>yy : Symbol(yy, Decl(intersectionsAndOptionalProperties.ts, 24, 5))
69+
70+
const xx: [number, ...number[]] = yy;
71+
>xx : Symbol(xx, Decl(intersectionsAndOptionalProperties.ts, 25, 5))
72+
>yy : Symbol(yy, Decl(intersectionsAndOptionalProperties.ts, 24, 5))
73+

tests/baselines/reference/intersectionsAndOptionalProperties.types

+11
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,14 @@ function foo(v: From) {
6363
>field : null
6464
}
6565

66+
// Repro from #38348
67+
68+
const yy: number[] & [number, ...number[]] = [1];
69+
>yy : number[] & [number, ...number[]]
70+
>[1] : [number]
71+
>1 : 1
72+
73+
const xx: [number, ...number[]] = yy;
74+
>xx : [number, ...number[]]
75+
>yy : number[] & [number, ...number[]]
76+

tests/cases/compiler/intersectionsAndOptionalProperties.ts

+5
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ function foo(v: From) {
2121
x = v; // Error
2222
x.field = v.field; // Error
2323
}
24+
25+
// Repro from #38348
26+
27+
const yy: number[] & [number, ...number[]] = [1];
28+
const xx: [number, ...number[]] = yy;

0 commit comments

Comments
 (0)