mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-04-17 01:49:41 -05:00
No number constraint to mapped type with as clause (#57093)
This commit is contained in:
committed by
GitHub
parent
10a63a9bb8
commit
0a2b0bbb4b
@@ -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);
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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[]>
|
||||
|
||||
@@ -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);
|
||||
Reference in New Issue
Block a user