Skip to content

Commit a2d8781

Browse files
committed
Port "Avoid resolving source prop type when the target is unknown/any"
1 parent e729a0a commit a2d8781

11 files changed

+40
-205
lines changed

internal/checker/relater.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4264,6 +4264,10 @@ func (r *Relater) propertyRelatedTo(source *Type, target *Type, sourceProp *ast.
42644264
func (r *Relater) isPropertySymbolTypeRelated(sourceProp *ast.Symbol, targetProp *ast.Symbol, getTypeOfSourceProperty func(sym *ast.Symbol) *Type, reportErrors bool, intersectionState IntersectionState) Ternary {
42654265
targetIsOptional := r.c.strictNullChecks && targetProp.CheckFlags&ast.CheckFlagsPartial != 0
42664266
effectiveTarget := r.c.addOptionalityEx(r.c.getNonMissingTypeOfSymbol(targetProp), false /*isProperty*/, targetIsOptional)
4267+
// source could resolve to `any` and that's not related to `unknown` target under strict subtype relation
4268+
if effectiveTarget.flags&core.IfElse(r.relation == r.c.strictSubtypeRelation, TypeFlagsAny, TypeFlagsAnyOrUnknown) != 0 {
4269+
return TernaryTrue
4270+
}
42674271
effectiveSource := getTypeOfSourceProperty(sourceProp)
42684272
return r.isRelatedToEx(effectiveSource, effectiveTarget, RecursionFlagsBoth, reportErrors, nil /*headMessage*/, intersectionState)
42694273
}

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter3.errors.txt

Lines changed: 0 additions & 16 deletions
This file was deleted.

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter3.errors.txt.diff

Lines changed: 0 additions & 20 deletions
This file was deleted.

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter3.types

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@
22

33
=== noCircularitySelfReferentialGetter3.ts ===
44
const a = {
5-
>a : any
6-
>{ prop: 42, get self() { return a; },} satisfies { prop: number; self: any } : { prop: number; readonly self: any; }
7-
>{ prop: 42, get self() { return a; },} : { prop: number; readonly self: any; }
5+
>a : { prop: number; readonly self: any; }
6+
>{ prop: 42, get self() { return a; },} satisfies { prop: number; self: any } : { prop: number; readonly self: { prop: number; readonly self: any; }; }
7+
>{ prop: 42, get self() { return a; },} : { prop: number; readonly self: { prop: number; readonly self: any; }; }
88

99
prop: 42,
1010
>prop : number
1111
>42 : 42
1212

1313
get self() {
14-
>self : any
14+
>self : { prop: number; readonly self: any; }
1515

1616
return a;
17-
>a : any
17+
>a : { prop: number; readonly self: any; }
1818

1919
},
2020
} satisfies { prop: number; self: any };

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter3.types.diff

Lines changed: 0 additions & 27 deletions
This file was deleted.

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter4.errors.txt

Lines changed: 0 additions & 18 deletions
This file was deleted.

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter4.errors.txt.diff

Lines changed: 0 additions & 22 deletions
This file was deleted.

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter4.symbols

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,17 @@ const a = {
2020

2121
const prop = a.self.self.self.self.self.prop;
2222
>prop : Symbol(prop, Decl(noCircularitySelfReferentialGetter4.ts, 7, 5))
23+
>a.self.self.self.self.self.prop : Symbol(prop, Decl(noCircularitySelfReferentialGetter4.ts, 0, 11))
24+
>a.self.self.self.self.self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
25+
>a.self.self.self.self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
26+
>a.self.self.self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
27+
>a.self.self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
28+
>a.self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
2329
>a : Symbol(a, Decl(noCircularitySelfReferentialGetter4.ts, 0, 5))
30+
>self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
31+
>self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
32+
>self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
33+
>self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
34+
>self : Symbol(self, Decl(noCircularitySelfReferentialGetter4.ts, 1, 11))
35+
>prop : Symbol(prop, Decl(noCircularitySelfReferentialGetter4.ts, 0, 11))
2436

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter4.symbols.diff

Lines changed: 0 additions & 19 deletions
This file was deleted.

testdata/baselines/reference/submodule/compiler/noCircularitySelfReferentialGetter4.types

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,38 @@
22

33
=== noCircularitySelfReferentialGetter4.ts ===
44
const a = {
5-
>a : any
6-
>{ prop: 42, get self() { return a; },} satisfies { prop: number; self: any } : { prop: number; readonly self: any; }
7-
>{ prop: 42, get self() { return a; },} : { prop: number; readonly self: any; }
5+
>a : { prop: number; readonly self: any; }
6+
>{ prop: 42, get self() { return a; },} satisfies { prop: number; self: any } : { prop: number; readonly self: { prop: number; readonly self: any; }; }
7+
>{ prop: 42, get self() { return a; },} : { prop: number; readonly self: { prop: number; readonly self: any; }; }
88

99
prop: 42,
1010
>prop : number
1111
>42 : 42
1212

1313
get self() {
14-
>self : any
14+
>self : { prop: number; readonly self: any; }
1515

1616
return a;
17-
>a : any
17+
>a : { prop: number; readonly self: any; }
1818

1919
},
2020
} satisfies { prop: number; self: any };
2121
>prop : number
2222
>self : any
2323

2424
const prop = a.self.self.self.self.self.prop;
25-
>prop : any
26-
>a.self.self.self.self.self.prop : any
27-
>a.self.self.self.self.self : any
28-
>a.self.self.self.self : any
29-
>a.self.self.self : any
30-
>a.self.self : any
31-
>a.self : any
32-
>a : any
33-
>self : any
34-
>self : any
35-
>self : any
36-
>self : any
37-
>self : any
38-
>prop : any
25+
>prop : number
26+
>a.self.self.self.self.self.prop : number
27+
>a.self.self.self.self.self : { prop: number; readonly self: any; }
28+
>a.self.self.self.self : { prop: number; readonly self: any; }
29+
>a.self.self.self : { prop: number; readonly self: any; }
30+
>a.self.self : { prop: number; readonly self: any; }
31+
>a.self : { prop: number; readonly self: any; }
32+
>a : { prop: number; readonly self: any; }
33+
>self : { prop: number; readonly self: any; }
34+
>self : { prop: number; readonly self: any; }
35+
>self : { prop: number; readonly self: any; }
36+
>self : { prop: number; readonly self: any; }
37+
>self : { prop: number; readonly self: any; }
38+
>prop : number
3939

0 commit comments

Comments
 (0)