TypeScript-syntaxfel vid användning av 'as'-typomvandling utan semikolon
Jag föredrar kodningsstil utan semikolon. Följande kodsnutt ger mig ett fel:
let x = 123
(window as any).test = 'hello'
Felet är:
Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures.Om jag sätter ett semikolon i slutet av den första raden kompileras det utan ett fel.
Jag trodde att ett radbrytnings tecken skulle vara tillräckligt för att TS ska kunna tolka dessa uttalanden separat. Kanske vet jag inte något, kanske är det en bugg? Jag skulle vilja veta förklaringen, tack.
REDIGERA: I det accepterade svaret från den angivna länken står det att ASI uppstår i fallet med var-uttryck. Vilket får mig att tro att samma gäller för let och const.
Så, vi har ett var-uttryck och en LineTerminator, och enligt detta bör TS tolka dessa två rader som två uttryck, inte ett. Var har jag fel?
Svar #1
Ett citat från ECMAScript-specifikationen, med min betoning tillagd:
När ett program, när det parseas från vänster till höger, ett token (kallat det förargande token) påträffas som inte är tillåtet av någon produktion i grammatiken, då infogas automatiskt ett semikolon före det förargande token om en eller flera av följande villkor är sanna...
Ett uttryck som 123 följt av en uppsättning parenteser är en tillåten produktion i grammatiken - det är ett funktionsanrop!
Parsern ser 123( och tror att du försöker anropa 123 som en funktion, så den kastar ett fel. Detta antyds av meddelandet du får - det säger att Number inte har en typdefinition för när du anropar den.