Wrong branch on conditional type with ReturnType of T condition
See original GitHub issueI think I found a bug.
Last non-broken TS version for this is 3.1.6 on typescript playground. All later versions are broken.
Which gets me thinking: is this maybe intended behavior because it is “broken” for so many versions?
But i dont know why it should NOT be a bug. Either way if it’s indeed not a bug, i need some serious brain rewiring from you guys please, because cant wrap my head around this behavior…
Let’s get started
TypeScript Version: Nightly, all the way down to and including 3.3.3, tested with all these versions on playground
Search Terms: conditional types return type
Code
type StringOrNumber<T extends () => any> = [ReturnType<T>] extends [string]
? string
: number;
type Test = StringOrNumber<() => number>; // oh noes, "string"
Expected behavior: I expect number. Because [number] just cannot extend [string]
The TS handbook talks about deferred evaluation of conditional types. I seems it is not working here!! Evaluation of “ReturnType<T>” should be deferred until the type is actually used in a concrete way!
Actual behavior: The conditional type evaluates to string no matter what function type is passed in
type StringOrNumber2<T extends () => number> = [ReturnType<T>] extends [string]
? string
: number;
type Test2 = StringOrNumber2<() => number>; // oh noes, "string"
Expected behavior: I expect number, even the generic constaint now demands it!
Actual behavior: Again, always get “string”
type StringOrNumber3<T extends () => number> = [number] extends [string]
? string
: number;
type Test3 = StringOrNumber3<() => number>; // correct, number
This is just for show, I expect number and get number, only difference is I now hardcode “number” instead of “ReturnType<T>”
Related Issues: no, searched the issues
Issue Analytics
- State:
- Created 3 years ago
- Comments:8 (7 by maintainers)
Top GitHub Comments
Normally this is where I say “Ah, here’s the subtle thing you missed”, but… yeah that seems totally broken and I don’t understand how it’s been that way for so long without anyone else noticing?
@jcalz Decided to put up a separate PR for that issue: #41622.