Skip to content

Commit 82df345

Browse files
committed
Revise behavior of mapped types with any/keyof any constraints
1 parent 0f4737e commit 82df345

File tree

6 files changed

+68
-8
lines changed

6 files changed

+68
-8
lines changed

src/compiler/checker.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14127,7 +14127,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1412714127
cb(getLiteralTypeFromProperty(prop, include));
1412814128
}
1412914129
if (type.flags & TypeFlags.Any) {
14130-
cb(stringType);
14130+
forEachType(stringsOnly ? stringType : stringNumberSymbolType, cb);
1413114131
}
1413214132
else {
1413314133
for (const info of getIndexInfosOfType(type)) {
@@ -14166,7 +14166,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1416614166

1416714167
function addMemberForKeyType(keyType: Type) {
1416814168
const propNameType = nameType ? instantiateType(nameType, appendTypeMapping(type.mapper, typeParameter, keyType)) : keyType;
14169-
forEachType(propNameType, t => addMemberForKeyTypeWorker(keyType, t));
14169+
forEachType(keyType.flags & TypeFlags.Any ? stringNumberSymbolType : propNameType, t => addMemberForKeyTypeWorker(keyType, t));
1417014170
}
1417114171

1417214172
function addMemberForKeyTypeWorker(keyType: Type, propNameType: Type) {
@@ -14201,10 +14201,8 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1420114201
members.set(propName, prop);
1420214202
}
1420314203
}
14204-
else if (isValidIndexKeyType(propNameType) || propNameType.flags & (TypeFlags.Any | TypeFlags.Enum)) {
14205-
const indexKeyType = propNameType.flags & (TypeFlags.Any | TypeFlags.String) ? stringType :
14206-
propNameType.flags & (TypeFlags.Number | TypeFlags.Enum) ? numberType :
14207-
propNameType;
14204+
else if (isValidIndexKeyType(propNameType) || propNameType.flags & TypeFlags.Enum) {
14205+
const indexKeyType = propNameType.flags & (TypeFlags.Number | TypeFlags.Enum) ? numberType : propNameType;
1420814206
const propType = instantiateType(templateType, appendTypeMapping(type.mapper, typeParameter, keyType));
1420914207
const modifiersIndexInfo = getApplicableIndexInfo(modifiersType, propNameType);
1421014208
const isReadonly = !!(templateModifiers & MappedTypeModifiers.IncludeReadonly ||

tests/baselines/reference/mappedTypeWithAny.errors.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,4 +77,10 @@ mappedTypeWithAny.ts(53,5): error TS2322: Type 'string[]' is not assignable to t
7777
type Evolver<T extends Evolvable<any> = any> = {
7878
[key in keyof Partial<T>]: never;
7979
};
80+
81+
// https://github.com/microsoft/TypeScript/issues/61203
82+
type Obj61203 = { [k in keyof any]: number };
83+
declare const obj61203: Obj61203;
84+
declare const key61203: keyof Obj61203;
85+
obj61203[key61203]; // ok
8086

tests/baselines/reference/mappedTypeWithAny.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ type Evolvable<E extends Evolver> = {
6363
type Evolver<T extends Evolvable<any> = any> = {
6464
[key in keyof Partial<T>]: never;
6565
};
66+
67+
// https://github.com/microsoft/TypeScript/issues/61203
68+
type Obj61203 = { [k in keyof any]: number };
69+
declare const obj61203: Obj61203;
70+
declare const key61203: keyof Obj61203;
71+
obj61203[key61203]; // ok
6672

6773

6874
//// [mappedTypeWithAny.js]
@@ -79,6 +85,7 @@ function bar(arrayish, objectish, indirectArrayish) {
7985
}
8086
var abc = stringifyArray(void 0);
8187
var def = stringifyPair(void 0);
88+
obj61203[key61203]; // ok
8289

8390

8491
//// [mappedTypeWithAny.d.ts]
@@ -128,3 +135,8 @@ type Evolvable<E extends Evolver> = {
128135
type Evolver<T extends Evolvable<any> = any> = {
129136
[key in keyof Partial<T>]: never;
130137
};
138+
type Obj61203 = {
139+
[k in keyof any]: number;
140+
};
141+
declare const obj61203: Obj61203;
142+
declare const key61203: keyof Obj61203;

tests/baselines/reference/mappedTypeWithAny.symbols

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,3 +177,20 @@ type Evolver<T extends Evolvable<any> = any> = {
177177

178178
};
179179

180+
// https://github.com/microsoft/TypeScript/issues/61203
181+
type Obj61203 = { [k in keyof any]: number };
182+
>Obj61203 : Symbol(Obj61203, Decl(mappedTypeWithAny.ts, 61, 2))
183+
>k : Symbol(k, Decl(mappedTypeWithAny.ts, 64, 19))
184+
185+
declare const obj61203: Obj61203;
186+
>obj61203 : Symbol(obj61203, Decl(mappedTypeWithAny.ts, 65, 13))
187+
>Obj61203 : Symbol(Obj61203, Decl(mappedTypeWithAny.ts, 61, 2))
188+
189+
declare const key61203: keyof Obj61203;
190+
>key61203 : Symbol(key61203, Decl(mappedTypeWithAny.ts, 66, 13))
191+
>Obj61203 : Symbol(Obj61203, Decl(mappedTypeWithAny.ts, 61, 2))
192+
193+
obj61203[key61203]; // ok
194+
>obj61203 : Symbol(obj61203, Decl(mappedTypeWithAny.ts, 65, 13))
195+
>key61203 : Symbol(key61203, Decl(mappedTypeWithAny.ts, 66, 13))
196+

tests/baselines/reference/mappedTypeWithAny.types

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ declare let x2: { [P in string]: Item };
2424
> : ^^^^^^^^^^^^^^^^^^^^^^
2525

2626
declare let x3: { [P in keyof any]: Item };
27-
>x3 : { [x: string]: Item; }
28-
> : ^^^^^^^^^^^^^^^^^^^^^^
27+
>x3 : { [x: string]: Item; [x: number]: Item; [x: symbol]: Item; }
28+
> : ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2929

3030
declare let x4: ItemMap<any>;
3131
>x4 : ItemMap<any>
@@ -197,3 +197,24 @@ type Evolver<T extends Evolvable<any> = any> = {
197197
[key in keyof Partial<T>]: never;
198198
};
199199

200+
// https://github.com/microsoft/TypeScript/issues/61203
201+
type Obj61203 = { [k in keyof any]: number };
202+
>Obj61203 : Obj61203
203+
> : ^^^^^^^^
204+
205+
declare const obj61203: Obj61203;
206+
>obj61203 : Obj61203
207+
> : ^^^^^^^^
208+
209+
declare const key61203: keyof Obj61203;
210+
>key61203 : string | number | symbol
211+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
212+
213+
obj61203[key61203]; // ok
214+
>obj61203[key61203] : number
215+
> : ^^^^^^
216+
>obj61203 : Obj61203
217+
> : ^^^^^^^^
218+
>key61203 : string | number | symbol
219+
> : ^^^^^^^^^^^^^^^^^^^^^^^^
220+

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,9 @@ type Evolvable<E extends Evolver> = {
6363
type Evolver<T extends Evolvable<any> = any> = {
6464
[key in keyof Partial<T>]: never;
6565
};
66+
67+
// https://github.com/microsoft/TypeScript/issues/61203
68+
type Obj61203 = { [k in keyof any]: number };
69+
declare const obj61203: Obj61203;
70+
declare const key61203: keyof Obj61203;
71+
obj61203[key61203]; // ok

0 commit comments

Comments
 (0)