microsoft / TypeScript

TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
https://www.typescriptlang.org
Apache License 2.0
100.75k stars 12.46k forks source link

Can extends [any, any] but not generic which is exactly [any, any] (woks till 5.3.3 breaks from 5.4.5) #60299

Open zedryas opened 8 hours ago

zedryas commented 8 hours ago

🔎 Search Terms

generic, tuple extends

🕗 Version & Regression Information

This code works in the playground with typescript version 5.3.3 but breaks since version 5.4.5 (version between are not available in the playground)

⏯ Playground Link

https://www.typescriptlang.org/play/?ts=5.6.3#code/C4TwDgpgBAIghsOUC8UDacBcUCMAaKAI2wCYCA6SgY2wGY0BdBgWACg3RIoAVCAZ2DdwEHAB5uUCAA9gEAHYATPlDhyQjAHwoobKHp6SZ8pekrkAlnIBmEAE5QASodmLlGNQVUgGFSl8YMUAD8jlDYchAAbnYcwlCyAjjavAJCkGLwiBpsAPQ5+gB6QWyxXCmCwiTizsbK-j5QALJwfADWNa4qaoza7iCeagxaqLr6EtIuJmhmljb2ThO1TS2tvuT1gSFO4VExrJzQCcAkyfwVkFWZcNmseYVBQA

💻 Code

type Data = [a: 1, b: 2, ...c: 3[]]

type TestType1<T extends any[]> = 
    T extends [...infer R extends [any, any], ...any[]] ? R : never
type test1 = TestType1<Data>
//   ^?

type TestType2<T extends any[], Mask extends any[] = [any, any]> = 
    T extends [...infer R extends Mask, ...any[]] ? R : never
type test2 = TestType2<Data>
//   ^?

🙁 Actual behavior

When passing the Mask as a generic and trying to extends the tuple with it to extract the relevant part, the resulting tuple is well formed, but item types are replaced with any

🙂 Expected behavior

Expect that constraint on infer to works wether as an explicit form or a generic holding a type with the exact same form, which used to be the case priori to typescript 5.4 bu breaks since

Additional information about the issue

No response

jcalz commented 5 hours ago

looks like this was caused by #57362