Type-narrowing/covariance/contravariance
Why is it that
5
has type 5
but {five:5}
has type {five:number}
and not {five:5}
?17 Replies
if you do
{five:5} as const
it will have the type { five: 5 }
iircYes! I use
as const
a lot 🙂 Kinda what led me to ask the question 😄well I think the assumption is just that you mean it to be a number
this is a big open question in type systems
lots of haskell theory you could read up on here for context
Heheh, I wrote my masters thesis project in Haskell
it turns out that making a type system usuable involves making some not-obvious tradeoffs
It sure is not obvious to me 🙂
But something in the back of my brain says it has to do with covariance/contravariance/etc.
I just can't really formulate it myself. The same is true for e.g. [5] becoming number[]
yeah that's a fun one
here's another fun one:
is a type error because x has type
never[]
Rightly so, if you ask me 😄
rust makes a tradeoff here where
actually just works ™️
That's interesting
What would you say the trade-off is?
Just out of curiosity
In this case, there's a usability/compile time tradeoff you make here
like I wish the typescript one just worked, but making type inference just work in that case is expensive
Exactly
swift took this to the extreme and some people consider that to be its biggest mistake
https://danielchasehooper.com/posts/why-swift-is-slow/
It does? Are you referring to extensions?
worth a read if you're curious
Ah right, I loved that about Swift when I coded iOS
This can't be correct