-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Inconsistent tsc behavior on TS 5.4 #58175
Comments
There's really not much we can do without a way to reproduce the problem, unfortunately |
Ok, I was able to reproduce it. Here is a link to StackBlitz. There are 2 main cases:
Also you could notice that there is React version doesn't really matter. It works the same on |
For what it's worth, the only thing that was merged in between those dates was #57122 |
This one is truly bizarre and took some time to figure out. It isn't directly related to #57122, but apparently that PR causes types to be resolved in a different order that triggers the deeper issue. Here's a shorter repro: type Includes<T, Keys extends string> = T extends object
? {
[K in keyof T]-?:
NonNullable<T[K]> extends object
? NonNullable<T[K]> extends any[]
? Includes<NonNullable<T[K]>[number], Keys>[]
: Includes<NonNullable<T[K]>, Keys>
: T[K];
}
: T;
type BaseEntity = {
id: number;
name: string;
};
type T0<T extends any[] & object> = T;
type T1 = T0<BaseEntity[]>; // Error! There obviously shouldn't be an error, and the error message is confounding: Type 'BaseEntity[]' does not satisfy the constraint 'any[] & object'.
The types returned by 'sort(...)' are incompatible between these types.
Type 'BaseEntity[]' is not assignable to type 'NonNullable<T[K]>'.
Type 'BaseEntity[]' is not assignable to type 'T[K]'.(2344)``` And, strangely, the error goes away when the It turns out to be a caching problem. Specifically, our caching of apparent types of intersection types. From function getApparentTypeOfIntersectionType(type: IntersectionType, thisArgument: Type) {
return type.resolvedApparentType || (type.resolvedApparentType = getTypeWithThisArgument(type, thisArgument, /*needApparentType*/ true));
} This logic fails to account for the The fix isn't hard. We simply need to account for both arguments to |
Even shorter repro: type TX<T extends any[] & object> = T["length"]; // Comment this out and error goes away
type T0<U extends any[] & object> = U;
type T1 = T0<string[]>; // Error! This reports the error: Type 'string[]' does not satisfy the constraint 'any[] & object'.
The types returned by 'sort(...)' are incompatible between these types.
Type 'string[]' is not assignable to type 'T'.
'T' could be instantiated with an arbitrary type which could be unrelated to 'string[]'. which obviously is crazy since |
Just update our project to TS 5.5. And everything works great! Thanks a lot, guys! 💪🏻 |
🔎 Search Terms
"tsc inconsistent behavior", "tsc 0 errors", "ts 5.4 bug", "5.4.0-dev.20240219"
🕗 Version & Regression Information
I wanted to update TS in our project from
v5.3.3
tov5.4.3
. And I noticed several weird things:tsc --noEmit
was showing 2 errors. I thought that VS Code was just not ready to supportv5.4.3
yet. But the new version comes withv5.4.3
and it still doesn't work correctly.tsc --noEmit
. It shows2 errors
. If I open a problematic file and put// @ts-expect-error
, it shows only1 error
. But if I remove that line, it instantly shows0 errors
.This changed between versions
5.4.0-dev.20240218
and5.4.0-dev.20240219
.5.4.0-dev.20240219
is the first version where I see this problem. I checked@next
version which is5.5.0-dev.20240412
and the error is still there.Unfortunately, I wasn't able to make a reproducible example due complexity of the code. But both errors are about
unknown
type where it should be detected just fine.⏯ Playground Link
No response
💻 Code
No response
🙁 Actual behavior
// @ts-expect-error
and removing that line, it shows0 errors
.🙂 Expected behavior
// @ts-expect-error
and removing that line, it shows all previous errors.Additional information about the issue
No response
The text was updated successfully, but these errors were encountered: