我更喜欢没有分号的编码风格。以下代码段给出了一个错误:
let x = 123
(window as any).test = 'hello'
错误是:
Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures.
如果我在第一行的末尾添加分号,则会编译而没有错误。
我认为换行符应足以让TS分别解析这些语句。也许我不知道什么,也许这是一个错误?我想知道解释。
编辑:在提供的链接中接受的答案中,声明ASI在var
声明的情况下发生。这让我觉得同样适用于let
和const
。
因此,我们有一个var
语句和一个LineTerminator
,根据这个TS应该将这两行解析为两个语句,而不是一个。我哪里错了?
答案 0 :(得分:1)
来自ECMAScript规范的引用,我的重点是:
当程序从左到右解析时,遇到令牌(称为违规令牌),任何语法产生都不允许,然后会自动插入分号如果满足以下一个或多个条件,则违规令牌......
123
之后跟一组括号的表达式允许生成语法 - 这是一个函数调用!
解析器看到123(
并认为您正在尝试将123
作为函数调用,因此会抛出错误。您收到的消息暗示了这一点 - 它说Number
没有为您调用它时的类型定义。