I 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
typeStringOrNumber<Textends()=>any>=[ReturnType<T>]extends[string]
? string
: number;typeTest=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" 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
typeStringOrNumber2<Textends()=>number>=[ReturnType<T>]extends[string]
? string
: number;typeTest2=StringOrNumber2<()=>number>;// oh noes, "string"
Expected behavior:
I expect number, even the generic constaint now demands it!
Actual behavior:
Again, always get "string"
typeStringOrNumber3<Textends()=>number>=[number]extends[string]
? string
: number;typeTest3=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"
Playground Link:https://www.typescriptlang.org/play/?ts=Nightly#code/FAkFwTwBwUwAgMpgE4EsB2BzA8sgcgK4C2ARjMgDwAqcMAHmDOgCYDOcAFAJRwC8AfHACG6CIN5wA2gCUYYAsnRVoMavwC6tBkzZTWKDJnXA4cAPxx9aLCbgAuOOmJlkAbnAq4VGPr6IDWLiEpOQU3HyCTiHI-K5wAPTxcAD2ABaOyT4ANHAARFaGuaDAkLD+1jj4zuQATNRajCzs4QKO1TF+MnIKSipqmvSNupIFWMamFqOYtg5RLu4lnt76NX5IFUHtdS2R7bEJSWkZ2XlTRaCl8OuGm9EAzPWDOs08rXPk4lLvyAPaTXoBIy2SaAmZtaILS5eHxgO5rQG3FwPHbglz7RJwADGyWQyBgmLAOW+xRJQA
Related Issues: no, searched the issues
I 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
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" 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
Expected behavior:
I expect number, even the generic constaint now demands it!
Actual behavior:
Again, always get "string"
This is just for show, I expect number and get number, only difference is I now hardcode "number" instead of "ReturnType"
Playground Link:https://www.typescriptlang.org/play/?ts=Nightly#code/FAkFwTwBwUwAgMpgE4EsB2BzA8sgcgK4C2ARjMgDwAqcMAHmDOgCYDOcAFAJRwC8AfHACG6CIN5wA2gCUYYAsnRVoMavwC6tBkzZTWKDJnXA4cAPxx9aLCbgAuOOmJlkAbnAq4VGPr6IDWLiEpOQU3HyCTiHI-K5wAPTxcAD2ABaOyT4ANHAARFaGuaDAkLD+1jj4zuQATNRajCzs4QKO1TF+MnIKSipqmvSNupIFWMamFqOYtg5RLu4lnt76NX5IFUHtdS2R7bEJSWkZ2XlTRaCl8OuGm9EAzPWDOs08rXPk4lLvyAPaTXoBIy2SaAmZtaILS5eHxgO5rQG3FwPHbglz7RJwADGyWQyBgmLAOW+xRJQA
Related Issues: no, searched the issues