Without a match expression and first-class exhaustiveness checking, discriminated unions are far less useful. Of course, this is because they don't want the TypeScript compiler to actually generate code, so they can't add runtime features. While TypeScript is better than no TypeScript, it seems like a massive waste to build a compiler and then shy away from making people's lives easier when possible.
Except forcing strict checking would not make people’s lives easier when the purpose of typescript is to add pre-runtime type checking to JS code.
There are massive JS codebases that simply could not adopt TS if strict checking was enforced.
If you do start a greenfield TS project then like you point out, you can indeed enable strict checking.
TS has helped improve so many JS codebases that were completely unmanageable before. And that’s entirely because it took a pragmatic incremental approach towards strictness in type checking instead of a dogmatic all or nothing approach.
What's wrong with using if statements?
```
if(shape.key === 'rectangle'){}
else if (shape.key === 'circle') {}
else {x: never = shape} // todo: use exhaustiveCheck(x: never)
```
That's pretty clear and easy.
Regardless F#'s biggest downfall is that to use it you basically have to be a C# expert already and learn the F# syntax and additional features on top of that. Otherwise it's a baffling standalone language because you're left wondering why there are two ways to do almost everything -- Task vs Async, struct ("tup", "les") vs ("regular", "tuples"), two kinds of extension methods for classes, Nullable<T> vs Option<T>, it goes on and on.
Is the interop between C# and F# not good? I've never used it myself, but I remember (and this is validated by a quick web search) that it's possible to just directly call F# code.