Skip to content

Commit 4804914

Browse files
committed
Don't add implicit number constraint to mapped type's type parameter when it has an as clause
1 parent 55153b0 commit 4804914

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed

src/compiler/checker.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16243,7 +16243,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
1624316243
}
1624416244
// Given a homomorphic mapped type { [K in keyof T]: XXX }, where T is constrained to an array or tuple type, in the
1624516245
// template type XXX, K has an added constraint of number | `${number}`.
16246-
else if (type.flags & TypeFlags.TypeParameter && parent.kind === SyntaxKind.MappedType && node === (parent as MappedTypeNode).type) {
16246+
else if (type.flags & TypeFlags.TypeParameter && parent.kind === SyntaxKind.MappedType && !(parent as MappedTypeNode).nameType && node === (parent as MappedTypeNode).type) {
1624716247
const mappedType = getTypeFromTypeNode(parent as TypeNode) as MappedType;
1624816248
if (getTypeParameterFromMappedType(mappedType) === getActualTypeVariable(type)) {
1624916249
const typeParameter = getHomomorphicTypeVariable(mappedType);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
//// [tests/cases/compiler/mappedTypeWithNameClauseAppliedToArrayType.ts] ////
2+
3+
=== mappedTypeWithNameClauseAppliedToArrayType.ts ===
4+
type Mappy<T extends unknown[]> = { [K in keyof T as K]: T[K] };
5+
>Mappy : Symbol(Mappy, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 0))
6+
>T : Symbol(T, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 11))
7+
>K : Symbol(K, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 37))
8+
>T : Symbol(T, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 11))
9+
>K : Symbol(K, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 37))
10+
>T : Symbol(T, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 11))
11+
>K : Symbol(K, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 37))
12+
13+
type NotArray = Mappy<number[]>;
14+
>NotArray : Symbol(NotArray, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 64))
15+
>Mappy : Symbol(Mappy, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 0))
16+
17+
declare function doArrayStuff(x: unknown[]): void;
18+
>doArrayStuff : Symbol(doArrayStuff, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 1, 32))
19+
>x : Symbol(x, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 3, 30))
20+
21+
declare const x: NotArray;
22+
>x : Symbol(x, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 4, 13))
23+
>NotArray : Symbol(NotArray, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 64))
24+
25+
doArrayStuff(x);
26+
>doArrayStuff : Symbol(doArrayStuff, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 1, 32))
27+
>x : Symbol(x, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 4, 13))
28+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
//// [tests/cases/compiler/mappedTypeWithNameClauseAppliedToArrayType.ts] ////
2+
3+
=== mappedTypeWithNameClauseAppliedToArrayType.ts ===
4+
type Mappy<T extends unknown[]> = { [K in keyof T as K]: T[K] };
5+
>Mappy : Mappy<T>
6+
7+
type NotArray = Mappy<number[]>;
8+
>NotArray : Mappy<number[]>
9+
10+
declare function doArrayStuff(x: unknown[]): void;
11+
>doArrayStuff : (x: unknown[]) => void
12+
>x : unknown[]
13+
14+
declare const x: NotArray;
15+
>x : Mappy<number[]>
16+
17+
doArrayStuff(x);
18+
>doArrayStuff(x) : void
19+
>doArrayStuff : (x: unknown[]) => void
20+
>x : Mappy<number[]>
21+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// @strict: true
2+
// @noEmit: true
3+
4+
type Mappy<T extends unknown[]> = { [K in keyof T as K]: T[K] };
5+
type NotArray = Mappy<number[]>;
6+
7+
declare function doArrayStuff(x: unknown[]): void;
8+
declare const x: NotArray;
9+
doArrayStuff(x);

0 commit comments

Comments
 (0)