编译器如何解释函数调用中的冒号?

时间:2018-12-23 10:22:55

标签: javascript typescript

我很好奇打字稿编译器在错误调用函数 foo 时是如何解释冒号的。

const foo = (bar: boolean) => {
    return bar;
}
foo(bar: true) // ERROR "Expected 1 arguments, but go 2."

这意味着它正在将“ bar”和“ true”都解释为参数。明确地说,我只是很好奇编译器如何解析它。

作为后续,在函数调用中是否有冒号的合法使用,除了在表达式中会导致参数的表达式之外,

const baz = (bin: {bar: boolean})=>{
    return bin.bar
}
baz({bar: true})

1 个答案:

答案 0 :(得分:2)

该行生成了两个错误。一个确实是函数需要两个参数,另一个是期望,(这是运行编译器时将看到的错误)。

即使对无效代码,语言服务也会尝试提供尽可能多的诊断。

解析器将在到达bar时尝试将:解析为参数(即表达式),因为:不能作为参数的一部分,它将停止解析参数表达式这样的表达(无论如何,现在还是这样)。然后,编译器将继续解析其期望的参数列表,并期望,,但找到:。现在这不是悲剧,编译器将继续解析参数列表,并将true解释为下一个参数表达式。

然后进行语义检查,将这个调用(带有两个参数)视为尝试调用一个带有两个参数的参数的函数,并给出错误提示。

您可能会在IDE中看到语法上的语义错误的原因是,语义错误与整个调用(foo(bar: true))相关,而语法错误仅与:相关(如果您将鼠标悬停在:上,则会看到',' expected错误)

关于后续跟踪:不能直接在参数列表中使用(例如可以在C#中使用命名参数)。唯一有效的用法是使用对象文字。