Skip to content

Commit c667a98

Browse files
authored
Merge pull request #26602 from Microsoft/fixMappedTypeDefinitelyAssignable
Fix definitely assignable relation for mapped types
2 parents 93c76cb + 45eb043 commit c667a98

File tree

6 files changed

+62
-1
lines changed

6 files changed

+62
-1
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11778,6 +11778,9 @@ namespace ts {
1177811778
}
1177911779
return Ternary.False;
1178011780
}
11781+
if (relation === definitelyAssignableRelation && isGenericMappedType(source)) {
11782+
return Ternary.False;
11783+
}
1178111784
const sourceIsPrimitive = !!(source.flags & TypeFlags.Primitive);
1178211785
if (relation !== identityRelation) {
1178311786
source = getApparentType(source);
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
=== tests/cases/compiler/mappedTypeNoTypeNoCrash.ts ===
22
type T0<T> = ({[K in keyof T]}) extends ({[key in K]: T[K]}) ? number : never;
3-
>T0 : number
3+
>T0 : T0<T>
44

tests/baselines/reference/mappedTypesArraysTuples.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,14 @@ declare function mapArray<T extends any[]>(arr: T): Mapped<T>;
8383
function acceptMappedArray<T extends any[]>(arr: T) {
8484
acceptArray(mapArray(arr));
8585
}
86+
87+
// Repro from #26163
88+
89+
type Unconstrained<T> = ElementType<Mapped<T>>;
90+
type T1 = Unconstrained<[string, number, boolean]>; // string | number | boolean
91+
92+
type Constrained<T extends any[]> = ElementType<Mapped<T>>;
93+
type T2 = Constrained<[string, number, boolean]>; // string | number | boolean
8694

8795

8896
//// [mappedTypesArraysTuples.js]
@@ -182,3 +190,7 @@ declare type R2 = ElementType<Mapped<[string, number, boolean]>>;
182190
declare function acceptArray(arr: any[]): void;
183191
declare function mapArray<T extends any[]>(arr: T): Mapped<T>;
184192
declare function acceptMappedArray<T extends any[]>(arr: T): void;
193+
declare type Unconstrained<T> = ElementType<Mapped<T>>;
194+
declare type T1 = Unconstrained<[string, number, boolean]>;
195+
declare type Constrained<T extends any[]> = ElementType<Mapped<T>>;
196+
declare type T2 = Constrained<[string, number, boolean]>;

tests/baselines/reference/mappedTypesArraysTuples.symbols

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -328,3 +328,27 @@ function acceptMappedArray<T extends any[]>(arr: T) {
328328
>arr : Symbol(arr, Decl(mappedTypesArraysTuples.ts, 81, 44))
329329
}
330330

331+
// Repro from #26163
332+
333+
type Unconstrained<T> = ElementType<Mapped<T>>;
334+
>Unconstrained : Symbol(Unconstrained, Decl(mappedTypesArraysTuples.ts, 83, 1))
335+
>T : Symbol(T, Decl(mappedTypesArraysTuples.ts, 87, 19))
336+
>ElementType : Symbol(ElementType, Decl(mappedTypesArraysTuples.ts, 66, 1))
337+
>Mapped : Symbol(Mapped, Decl(mappedTypesArraysTuples.ts, 70, 59))
338+
>T : Symbol(T, Decl(mappedTypesArraysTuples.ts, 87, 19))
339+
340+
type T1 = Unconstrained<[string, number, boolean]>; // string | number | boolean
341+
>T1 : Symbol(T1, Decl(mappedTypesArraysTuples.ts, 87, 47))
342+
>Unconstrained : Symbol(Unconstrained, Decl(mappedTypesArraysTuples.ts, 83, 1))
343+
344+
type Constrained<T extends any[]> = ElementType<Mapped<T>>;
345+
>Constrained : Symbol(Constrained, Decl(mappedTypesArraysTuples.ts, 88, 51))
346+
>T : Symbol(T, Decl(mappedTypesArraysTuples.ts, 90, 17))
347+
>ElementType : Symbol(ElementType, Decl(mappedTypesArraysTuples.ts, 66, 1))
348+
>Mapped : Symbol(Mapped, Decl(mappedTypesArraysTuples.ts, 70, 59))
349+
>T : Symbol(T, Decl(mappedTypesArraysTuples.ts, 90, 17))
350+
351+
type T2 = Constrained<[string, number, boolean]>; // string | number | boolean
352+
>T2 : Symbol(T2, Decl(mappedTypesArraysTuples.ts, 90, 59))
353+
>Constrained : Symbol(Constrained, Decl(mappedTypesArraysTuples.ts, 88, 51))
354+

tests/baselines/reference/mappedTypesArraysTuples.types

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,17 @@ function acceptMappedArray<T extends any[]>(arr: T) {
241241
>arr : T
242242
}
243243

244+
// Repro from #26163
245+
246+
type Unconstrained<T> = ElementType<Mapped<T>>;
247+
>Unconstrained : ElementType<Mapped<T>>
248+
249+
type T1 = Unconstrained<[string, number, boolean]>; // string | number | boolean
250+
>T1 : string | number | boolean
251+
252+
type Constrained<T extends any[]> = ElementType<Mapped<T>>;
253+
>Constrained : ElementType<Mapped<T>>
254+
255+
type T2 = Constrained<[string, number, boolean]>; // string | number | boolean
256+
>T2 : string | number | boolean
257+

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,11 @@ declare function mapArray<T extends any[]>(arr: T): Mapped<T>;
8585
function acceptMappedArray<T extends any[]>(arr: T) {
8686
acceptArray(mapArray(arr));
8787
}
88+
89+
// Repro from #26163
90+
91+
type Unconstrained<T> = ElementType<Mapped<T>>;
92+
type T1 = Unconstrained<[string, number, boolean]>; // string | number | boolean
93+
94+
type Constrained<T extends any[]> = ElementType<Mapped<T>>;
95+
type T2 = Constrained<[string, number, boolean]>; // string | number | boolean

0 commit comments

Comments
 (0)