unntak - Typescript 2 - kaste i ternær-/betinget operatoruttrykk
Jeg prøver å kompilere:
const value = "20"
const x : string | never = "10" === value ? throw Error("bad things") : "hello"
... og får en feil på throw - expression expected. Jeg kan løse dette ved å bruke en inline-metode som kalles på stedet, men det ser ikke bra ut. ((() => {throw Error("bad things"})())
Hvorfor er det ikke greit å kaste i en gren av den ternære operatøren? Eller finnes det en annen syntaks som fungerer, kanskje kompilatorvalg jeg mangler?
Throw ser heller ikke ut til å fungere uten krøllparenteser i funksjonskroppen, i løsningen, ((() => throw Error("bad things")()).
Svar #1
Det er fortsatt et åpent spørsmål.
https://github.com/microsoft/TypeScript/issues/18535
Basert på problemet, vil ikke implementeringen begynne før ECMA TC39 når en konklusjon.
Svar #2
Det er en syntaktisk særegenhet i språket.
Utsagnet throw ex kan betraktes som et uttrykk som har typen never, fordi never er typen for funksjoner som ikke returnerer, noe som er akkurat det som skjer når du throw. I mange språk som har en bunn-type (det tekniske begrepet for det never er - det er ikke bare et «merkelig nøkkelord»).
Setningen throw ex er annerledes enn for eksempel setningen for (let x of ...) fordi sistnevnte ikke kan forstås som å returnere noe, mens throw ex kan forstås som å returnere never.