Skip to content

Commit 9e34a81

Browse files
committed
Fix regression of generic T assignability to Partial<T>
1 parent c6b2869 commit 9e34a81

File tree

6 files changed

+42
-1
lines changed

6 files changed

+42
-1
lines changed

src/compiler/checker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13443,7 +13443,8 @@ namespace ts {
1344313443
if (includeOptional
1344413444
? !(filteredByApplicability!.flags & TypeFlags.Never)
1344513445
: isRelatedTo(targetConstraint, sourceKeys)) {
13446-
const indexingType = filteredByApplicability || getTypeParameterFromMappedType(target);
13446+
const typeParameter = getTypeParameterFromMappedType(target);
13447+
const indexingType = filteredByApplicability ? getIntersectionType([filteredByApplicability, typeParameter]) : typeParameter;
1344713448
const indexedAccessType = getIndexedAccessType(source, indexingType);
1344813449
const templateType = getTemplateTypeFromMappedType(target);
1344913450
if (result = isRelatedTo(indexedAccessType, templateType, reportErrors)) {

tests/baselines/reference/mappedTypeRelationships.errors.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,4 +392,8 @@ tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(168,5): error TS
392392
function f90<T extends { x: number }>() {
393393
const n: Numeric<T> = { x: 1 };
394394
}
395+
396+
function f<T extends { x: {} }>(): Partial<T> {
397+
return undefined! as T;
398+
}
395399

tests/baselines/reference/mappedTypeRelationships.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,10 @@ type Numeric<T> = { [K in keyof T]?: number };
186186
function f90<T extends { x: number }>() {
187187
const n: Numeric<T> = { x: 1 };
188188
}
189+
190+
function f<T extends { x: {} }>(): Partial<T> {
191+
return undefined! as T;
192+
}
189193

190194

191195
//// [mappedTypeRelationships.js]
@@ -319,6 +323,9 @@ function f82(t, k1, k2) {
319323
function f90() {
320324
var n = { x: 1 };
321325
}
326+
function f() {
327+
return undefined;
328+
}
322329

323330

324331
//// [mappedTypeRelationships.d.ts]
@@ -408,3 +415,6 @@ declare type Numeric<T> = {
408415
declare function f90<T extends {
409416
x: number;
410417
}>(): void;
418+
declare function f<T extends {
419+
x: {};
420+
}>(): Partial<T>;

tests/baselines/reference/mappedTypeRelationships.symbols

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -824,3 +824,15 @@ function f90<T extends { x: number }>() {
824824
>x : Symbol(x, Decl(mappedTypeRelationships.ts, 185, 27))
825825
}
826826

827+
function f<T extends { x: {} }>(): Partial<T> {
828+
>f : Symbol(f, Decl(mappedTypeRelationships.ts, 186, 1))
829+
>T : Symbol(T, Decl(mappedTypeRelationships.ts, 188, 11))
830+
>x : Symbol(x, Decl(mappedTypeRelationships.ts, 188, 22))
831+
>Partial : Symbol(Partial, Decl(lib.es5.d.ts, --, --))
832+
>T : Symbol(T, Decl(mappedTypeRelationships.ts, 188, 11))
833+
834+
return undefined! as T;
835+
>undefined : Symbol(undefined)
836+
>T : Symbol(T, Decl(mappedTypeRelationships.ts, 188, 11))
837+
}
838+

tests/baselines/reference/mappedTypeRelationships.types

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,3 +668,13 @@ function f90<T extends { x: number }>() {
668668
>1 : 1
669669
}
670670

671+
function f<T extends { x: {} }>(): Partial<T> {
672+
>f : <T extends { x: {}; }>() => Partial<T>
673+
>x : {}
674+
675+
return undefined! as T;
676+
>undefined! as T : T
677+
>undefined! : never
678+
>undefined : undefined
679+
}
680+

tests/cases/conformance/types/mapped/mappedTypeRelationships.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,3 +188,7 @@ type Numeric<T> = { [K in keyof T]?: number };
188188
function f90<T extends { x: number }>() {
189189
const n: Numeric<T> = { x: 1 };
190190
}
191+
192+
function f<T extends { x: {} }>(): Partial<T> {
193+
return undefined! as T;
194+
}

0 commit comments

Comments
 (0)