No number constraint to mapped type with as clause (#57093)

This commit is contained in:
Gabriela Araujo Britto
2024-01-19 14:36:51 -08:00
committed by GitHub
parent 10a63a9bb8
commit 0a2b0bbb4b
4 changed files with 59 additions and 1 deletions

View File

@@ -16225,7 +16225,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
}
// Given a homomorphic mapped type { [K in keyof T]: XXX }, where T is constrained to an array or tuple type, in the
// template type XXX, K has an added constraint of number | `${number}`.
else if (type.flags & TypeFlags.TypeParameter && parent.kind === SyntaxKind.MappedType && node === (parent as MappedTypeNode).type) {
else if (type.flags & TypeFlags.TypeParameter && parent.kind === SyntaxKind.MappedType && !(parent as MappedTypeNode).nameType && node === (parent as MappedTypeNode).type) {
const mappedType = getTypeFromTypeNode(parent as TypeNode) as MappedType;
if (getTypeParameterFromMappedType(mappedType) === getActualTypeVariable(type)) {
const typeParameter = getHomomorphicTypeVariable(mappedType);

View File

@@ -0,0 +1,28 @@
//// [tests/cases/compiler/mappedTypeWithNameClauseAppliedToArrayType.ts] ////
=== mappedTypeWithNameClauseAppliedToArrayType.ts ===
type Mappy<T extends unknown[]> = { [K in keyof T as K]: T[K] };
>Mappy : Symbol(Mappy, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 0))
>T : Symbol(T, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 11))
>K : Symbol(K, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 37))
>T : Symbol(T, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 11))
>K : Symbol(K, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 37))
>T : Symbol(T, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 11))
>K : Symbol(K, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 37))
type NotArray = Mappy<number[]>;
>NotArray : Symbol(NotArray, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 64))
>Mappy : Symbol(Mappy, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 0))
declare function doArrayStuff(x: unknown[]): void;
>doArrayStuff : Symbol(doArrayStuff, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 1, 32))
>x : Symbol(x, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 3, 30))
declare const x: NotArray;
>x : Symbol(x, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 4, 13))
>NotArray : Symbol(NotArray, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 0, 64))
doArrayStuff(x);
>doArrayStuff : Symbol(doArrayStuff, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 1, 32))
>x : Symbol(x, Decl(mappedTypeWithNameClauseAppliedToArrayType.ts, 4, 13))

View File

@@ -0,0 +1,21 @@
//// [tests/cases/compiler/mappedTypeWithNameClauseAppliedToArrayType.ts] ////
=== mappedTypeWithNameClauseAppliedToArrayType.ts ===
type Mappy<T extends unknown[]> = { [K in keyof T as K]: T[K] };
>Mappy : Mappy<T>
type NotArray = Mappy<number[]>;
>NotArray : Mappy<number[]>
declare function doArrayStuff(x: unknown[]): void;
>doArrayStuff : (x: unknown[]) => void
>x : unknown[]
declare const x: NotArray;
>x : Mappy<number[]>
doArrayStuff(x);
>doArrayStuff(x) : void
>doArrayStuff : (x: unknown[]) => void
>x : Mappy<number[]>

View File

@@ -0,0 +1,9 @@
// @strict: true
// @noEmit: true
type Mappy<T extends unknown[]> = { [K in keyof T as K]: T[K] };
type NotArray = Mappy<number[]>;
declare function doArrayStuff(x: unknown[]): void;
declare const x: NotArray;
doArrayStuff(x);