Skip to content

Commit 4c69959

Browse files
committed
Revert nameType intantiation
1 parent 880d4af commit 4c69959

4 files changed

Lines changed: 66 additions & 21 deletions

File tree

src/compiler/checker.ts

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17637,7 +17637,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1763717637
* reduction in the constraintType) when possible.
1763817638
* @param noIndexSignatures Indicates if _string_ index signatures should be elided. (other index signatures are always reported)
1763917639
*/
17640-
function getIndexTypeForMappedType(type: MappedType, indexFlags: IndexFlags): Type {
17640+
function getIndexTypeForMappedType(type: MappedType, indexFlags: IndexFlags) {
1764117641
const typeParameter = getTypeParameterFromMappedType(type);
1764217642
const constraintType = getConstraintTypeFromMappedType(type);
1764317643
const nameType = getNameTypeFromMappedType(type.target as MappedType || type);
@@ -17651,12 +17651,6 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1765117651
// a circular definition. For this reason, we only eagerly manifest the keys if the constraint is non-generic.
1765217652
if (isGenericIndexType(constraintType)) {
1765317653
if (isMappedTypeWithKeyofConstraintDeclaration(type)) {
17654-
if (nameType) {
17655-
const modifiersIndex = getIndexType(getModifiersTypeFromMappedType(type), indexFlags, UnionReduction.None);
17656-
const mapper = makeUnaryTypeMapper(getTypeParameterFromMappedType(type), modifiersIndex);
17657-
const nameMapper = combineTypeMappers(type.mapper, mapper);
17658-
return instantiateType(nameType, nameMapper);
17659-
}
1766017654
// We have a generic index and a homomorphic mapping (but a distributive key remapping) - we need to defer
1766117655
// the whole `keyof whatever` for later since it's not safe to resolve the shape of modifier type.
1766217656
return getIndexTypeForGenericType(type, indexFlags);
@@ -17745,13 +17739,13 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1774517739
return !!(keyType.flags & include || keyType.flags & TypeFlags.Intersection && some((keyType as IntersectionType).types, t => isKeyTypeIncluded(t, include)));
1774617740
}
1774717741

17748-
function getLiteralTypeFromProperties(type: Type, include: TypeFlags, includeOrigin: boolean, unionReduction = UnionReduction.Literal) {
17742+
function getLiteralTypeFromProperties(type: Type, include: TypeFlags, includeOrigin: boolean) {
1774917743
const origin = includeOrigin && (getObjectFlags(type) & (ObjectFlags.ClassOrInterface | ObjectFlags.Reference) || type.aliasSymbol) ? createOriginIndexType(type) : undefined;
1775017744
const propertyTypes = map(getPropertiesOfType(type), prop => getLiteralTypeFromProperty(prop, include));
1775117745
const indexKeyTypes = map(getIndexInfosOfType(type), info =>
1775217746
info !== enumNumberIndexInfo && isKeyTypeIncluded(info.keyType, include) ?
1775317747
info.keyType === stringType && include & TypeFlags.Number ? stringOrNumberType : info.keyType : neverType);
17754-
return getUnionType(concatenate(propertyTypes, indexKeyTypes), unionReduction, /*aliasSymbol*/ undefined, /*aliasTypeArguments*/ undefined, origin);
17748+
return getUnionType(concatenate(propertyTypes, indexKeyTypes), UnionReduction.Literal, /*aliasSymbol*/ undefined, /*aliasTypeArguments*/ undefined, origin);
1775517749
}
1775617750

1775717751
function shouldDeferIndexType(type: Type, indexFlags = IndexFlags.None) {
@@ -17762,16 +17756,16 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1776217756
type.flags & TypeFlags.Intersection && maybeTypeOfKind(type, TypeFlags.Instantiable) && some((type as IntersectionType).types, isEmptyAnonymousObjectType));
1776317757
}
1776417758

17765-
function getIndexType(type: Type, indexFlags = defaultIndexFlags, unionReduction?: UnionReduction): Type {
17759+
function getIndexType(type: Type, indexFlags = defaultIndexFlags): Type {
1776617760
type = getReducedType(type);
1776717761
return shouldDeferIndexType(type, indexFlags) ? getIndexTypeForGenericType(type as InstantiableType | UnionOrIntersectionType, indexFlags) :
1776817762
type.flags & TypeFlags.Union ? getIntersectionType(map((type as UnionType).types, t => getIndexType(t, indexFlags))) :
17769-
type.flags & TypeFlags.Intersection ? getUnionType(map((type as IntersectionType).types, t => getIndexType(t, indexFlags, unionReduction)), unionReduction) :
17763+
type.flags & TypeFlags.Intersection ? getUnionType(map((type as IntersectionType).types, t => getIndexType(t, indexFlags))) :
1777017764
getObjectFlags(type) & ObjectFlags.Mapped ? getIndexTypeForMappedType(type as MappedType, indexFlags) :
1777117765
type === wildcardType ? wildcardType :
1777217766
type.flags & TypeFlags.Unknown ? neverType :
1777317767
type.flags & (TypeFlags.Any | TypeFlags.Never) ? keyofConstraintType :
17774-
getLiteralTypeFromProperties(type, (indexFlags & IndexFlags.NoIndexSignatures ? TypeFlags.StringLiteral : TypeFlags.StringLike) | (indexFlags & IndexFlags.StringsOnly ? 0 : TypeFlags.NumberLike | TypeFlags.ESSymbolLike), indexFlags === defaultIndexFlags, unionReduction);
17768+
getLiteralTypeFromProperties(type, (indexFlags & IndexFlags.NoIndexSignatures ? TypeFlags.StringLiteral : TypeFlags.StringLike) | (indexFlags & IndexFlags.StringsOnly ? 0 : TypeFlags.NumberLike | TypeFlags.ESSymbolLike), indexFlags === defaultIndexFlags);
1777517769
}
1777617770

1777717771
function getExtractStringType(type: Type) {

tests/baselines/reference/keyRemappingKeyofResult.types

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -156,19 +156,19 @@ function g<T>() {
156156
// no string index signature, right?
157157

158158
type Oops = keyof Remapped;
159-
>Oops : unique symbol | "str" | (keyof T extends infer T_1 ? T_1 extends keyof T ? T_1 extends unknown ? {} extends Record<T_1, any> ? never : T_1 : never : never : never)
159+
>Oops : keyof { [K in keyof ({ [k: string]: any; str: any; [sym]: any; } & T) as K extends unknown ? {} extends Record<K, any> ? never : K : never]: any; }
160160

161161
let x: Oops;
162-
>x : unique symbol | "str" | (keyof T extends infer T_1 ? T_1 extends keyof T ? T_1 extends unknown ? {} extends Record<T_1, any> ? never : T_1 : never : never : never)
162+
>x : keyof { [K in keyof ({ [k: string]: any; str: any; [sym]: any; } & T) as K extends unknown ? {} extends Record<K, any> ? never : K : never]: any; }
163163

164164
x = sym;
165165
>x = sym : unique symbol
166-
>x : unique symbol | "str" | (keyof T extends infer T_1 ? T_1 extends keyof T ? T_1 extends unknown ? {} extends Record<T_1, any> ? never : T_1 : never : never : never)
166+
>x : keyof { [K in keyof ({ [k: string]: any; str: any; [sym]: any; } & T) as K extends unknown ? {} extends Record<K, any> ? never : K : never]: any; }
167167
>sym : unique symbol
168168

169169
x = "str";
170170
>x = "str" : "str"
171-
>x : unique symbol | "str" | (keyof T extends infer T_1 ? T_1 extends keyof T ? T_1 extends unknown ? {} extends Record<T_1, any> ? never : T_1 : never : never : never)
171+
>x : keyof { [K in keyof ({ [k: string]: any; str: any; [sym]: any; } & T) as K extends unknown ? {} extends Record<K, any> ? never : K : never]: any; }
172172
>"str" : "str"
173173
}
174174

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
keyRemappingKeyofResult2.ts(23,7): error TS2344: Type 'Values<{ [K in keyof TActors as K & string]: { src: K; logic: TActors[K]; }; }>' does not satisfy the constraint 'ProvidedActor'.
2+
Types of property 'src' are incompatible.
3+
Type 'keyof { [K in keyof TActors as K & string]: { src: K; logic: TActors[K]; }; }' is not assignable to type 'string'.
4+
Type 'string | number | symbol' is not assignable to type 'string'.
5+
Type 'number' is not assignable to type 'string'.
6+
7+
8+
==== keyRemappingKeyofResult2.ts (1 errors) ====
9+
// https://github.com/microsoft/TypeScript/issues/56239
10+
11+
type Values<T> = T[keyof T];
12+
13+
type ProvidedActor = {
14+
src: string;
15+
logic: unknown;
16+
};
17+
18+
interface StateMachineConfig<TActors extends ProvidedActor> {
19+
invoke: {
20+
src: TActors["src"];
21+
};
22+
}
23+
24+
declare function setup<TActors extends Record<string, unknown>>(_: {
25+
actors: {
26+
[K in keyof TActors]: TActors[K];
27+
};
28+
}): {
29+
createMachine: (
30+
config: StateMachineConfig<
31+
Values<{
32+
~~~~~~~~
33+
[K in keyof TActors as K & string]: {
34+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
35+
src: K;
36+
~~~~~~~~~~~~~~~~~
37+
logic: TActors[K];
38+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
39+
};
40+
~~~~~~~~~~
41+
}>
42+
~~~~~~~~
43+
!!! error TS2344: Type 'Values<{ [K in keyof TActors as K & string]: { src: K; logic: TActors[K]; }; }>' does not satisfy the constraint 'ProvidedActor'.
44+
!!! error TS2344: Types of property 'src' are incompatible.
45+
!!! error TS2344: Type 'keyof { [K in keyof TActors as K & string]: { src: K; logic: TActors[K]; }; }' is not assignable to type 'string'.
46+
!!! error TS2344: Type 'string | number | symbol' is not assignable to type 'string'.
47+
!!! error TS2344: Type 'number' is not assignable to type 'string'.
48+
>,
49+
) => void;
50+
};
51+

tests/baselines/reference/mappedTypeAsClauses.types

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -267,16 +267,16 @@ type NameMap = { 'a': 'x', 'b': 'y', 'c': 'z' };
267267
// Distributive, will be simplified
268268

269269
type TS0<T> = keyof { [P in keyof T as keyof Record<P, number>]: string };
270-
>TS0 : keyof T
270+
>TS0 : keyof { [P in keyof T as P]: string; }
271271

272272
type TS1<T> = keyof { [P in keyof T as Extract<P, 'a' | 'b' | 'c'>]: string };
273-
>TS1 : Extract<keyof T, "a" | "b" | "c">
273+
>TS1 : keyof { [P in keyof T as Extract<P, "a" | "b" | "c">]: string; }
274274

275275
type TS2<T> = keyof { [P in keyof T as P & ('a' | 'b' | 'c')]: string };
276-
>TS2 : keyof T & ("a" | "b" | "c")
276+
>TS2 : keyof { [P in keyof T as P & ("a" | "b" | "c")]: string; }
277277

278278
type TS3<T> = keyof { [P in keyof T as Exclude<P, 'a' | 'b' | 'c'>]: string };
279-
>TS3 : Exclude<keyof T, "a" | "b" | "c">
279+
>TS3 : keyof { [P in keyof T as Exclude<P, "a" | "b" | "c">]: string; }
280280

281281
type TS4<T> = keyof { [P in keyof T as NameMap[P & keyof NameMap]]: string };
282282
>TS4 : keyof { [P in keyof T as NameMap[P & keyof NameMap]]: string; }
@@ -285,7 +285,7 @@ type TS5<T> = keyof { [P in keyof T & keyof NameMap as NameMap[P]]: string };
285285
>TS5 : keyof { [P in keyof T & keyof NameMap as NameMap[P]]: string; }
286286

287287
type TS6<T, U, V> = keyof { [ K in keyof T as V & (K extends U ? K : never)]: string };
288-
>TS6 : V & (keyof T extends infer T_1 ? T_1 extends keyof T ? T_1 extends U ? T_1 : never : never : never)
288+
>TS6 : keyof { [K in keyof T as V & (K extends U ? K : never)]: string; }
289289

290290
// Non-distributive, won't be simplified
291291

0 commit comments

Comments
 (0)