我很好奇打字稿编译器在错误调用函数 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})
答案 0 :(得分:2)
该行生成了两个错误。一个确实是函数需要两个参数,另一个是期望,
(这是运行编译器时将看到的错误)。
即使对无效代码,语言服务也会尝试提供尽可能多的诊断。
解析器将在到达bar
时尝试将:
解析为参数(即表达式),因为:
不能作为参数的一部分,它将停止解析参数表达式这样的表达(无论如何,现在还是这样)。然后,编译器将继续解析其期望的参数列表,并期望,
,但找到:
。现在这不是悲剧,编译器将继续解析参数列表,并将true
解释为下一个参数表达式。
然后进行语义检查,将这个调用(带有两个参数)视为尝试调用一个带有两个参数的参数的函数,并给出错误提示。
您可能会在IDE中看到语法上的语义错误的原因是,语义错误与整个调用(foo(bar: true)
)相关,而语法错误仅与:
相关(如果您将鼠标悬停在:
上,则会看到',' expected
错误)
关于后续跟踪:
不能直接在参数列表中使用(例如可以在C#中使用命名参数)。唯一有效的用法是使用对象文字。