You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
@@ -22507,9 +22512,23 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
22507
22512
}
22508
22513
}
22509
22514
else if (sourceFlags & TypeFlags.Index) {
22510
-
if (result = isRelatedTo(keyofConstraintType, target, RecursionFlags.Source, reportErrors)) {
22515
+
const isDeferredMappedIndex = shouldDeferIndexType((source as IndexType).type, (source as IndexType).indexFlags) && getObjectFlags((source as IndexType).type) & ObjectFlags.Mapped;
22516
+
if (result = isRelatedTo(keyofConstraintType, target, RecursionFlags.Source, reportErrors && !isDeferredMappedIndex)) {
22511
22517
return result;
22512
22518
}
22519
+
if (isDeferredMappedIndex) {
22520
+
const mappedType = (source as IndexType).type as MappedType;
// Unlike on the target side, on the source side we do *not* include the generic part of the `nameType`, since that comes from a
22523
+
// (potentially anonymous) mapped type local type parameter, so that'd never assign outside the mapped type body, but we still want to
22524
+
// allow assignments of index types of identical (or similar enough) mapped types.
22525
+
// eg, `keyof {[X in keyof A]: Obj[X]}` should be assignable to `keyof {[Y in keyof A]: Tup[Y]}` because both map over the same set of keys (`keyof A`).
22526
+
// Without this source-side breakdown, a `keyof {[X in keyof A]: Obj[X]}` style type won't be assignable to anything except itself, which is much too strict.
export function enumFromStrings<const Members extends readonly string[]>() {
5
+
>enumFromStrings : <const Members extends readonly string[]>() => { [Property in keyof { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }]: { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }[Property]; }
6
+
7
+
type Part1 = {
8
+
>Part1 : { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }
9
+
10
+
[key in keyof Members as Members[key] extends string
11
+
? Members[key]
12
+
: never]: Members[key];
13
+
};
14
+
type Part2 = { [Property in keyof Part1]: Part1[Property] };
15
+
>Part2 : { [Property in keyof { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }]: { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }[Property]; }
16
+
17
+
return Object.create(null) as Part2;
18
+
>Object.create(null) as Part2 : { [Property in keyof { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }]: { [key in keyof Members as Members[key] extends string ? Members[key] : never]: Members[key]; }[Property]; }
0 commit comments