-
Notifications
You must be signed in to change notification settings - Fork 12.9k
Closed
Labels
BugA bug in TypeScriptA bug in TypeScriptFix AvailableA PR has been opened for this issueA PR has been opened for this issueRecent RegressionThis is a new regression just found in the last major/minor version of TypeScript.This is a new regression just found in the last major/minor version of TypeScript.
Milestone
Description
π Search Terms
mapped type assignability regression
π Version & Regression Information
- This changed between versions 5.3 and 5.4
β― Playground Link
π» Code
type ValueType = string;
type Box<T extends ValueType> = { v: T };
type Test<T extends ValueType[]> = T
type UnboxArray<T> = {
[K in keyof T]: T[K] extends Box<infer R> ? R : never;
};
type Identity<T> = { [K in keyof T]: T[K] };
declare function fnBad<T extends Array<Box<ValueType>>>(...args: T): Test<Identity<UnboxArray<T>>>;
declare function fnOk<T extends Array<Box<ValueType>>>(...args: T): Test<UnboxArray<T>>;
type Unbox<T> = T extends Array<Box<infer R>> ? Array<R> : never;
declare function fnSimilar<T extends Array<Box<ValueType>>>(...args: T): Test<Identity<Unbox<T>>>;
π Actual behavior
Test<Identity<UnboxArray<T>>>
is being reported as an error because Identity<UnboxArray<T>>
is not assignable to the constraint of Test
. Even more strange the error elaboration says Type 'Box<string>' is not assignable to type 'string'
which is strange since the type that comes out of UnboxArray<T>
can't have Box<string>
as an item type. If we don't pass the type though the Identity
mapped type, then UnboxArray<T>
is assignable to ValueType[]
.
π Expected behavior
Test<Identity<UnboxArray<T>>>
should not be an error as it is in 5.3
Additional information about the issue
No response
Metadata
Metadata
Assignees
Labels
BugA bug in TypeScriptA bug in TypeScriptFix AvailableA PR has been opened for this issueA PR has been opened for this issueRecent RegressionThis is a new regression just found in the last major/minor version of TypeScript.This is a new regression just found in the last major/minor version of TypeScript.