见下文
/**
* @param {string} a
* @param {string} b
*/
var f = function(a, b){
// ...
}
/**
* @param {string} a
* @param {boolean} c
*/
var h = function(a, c){
f.apply(this, arguments); // no compile error
f.apply(this, [a, c]); // no compile error
f.call(this, a, c); // compile error: does not match formal parameter
}
为什么Closure仅在使用呼叫时引发错误而不适用? 有没有办法我可以进行封闭类型检查参数,即使我使用apply?
答案 0 :(得分:2)
因为(a)类型检查器还没有元组类型的概念,并且(b)很少调用带有数组文字的方法。使用.call时确定哪个参数分配给哪个参数槽是微不足道的。
如果类型系统增长了一个元组类型,那么就需要花费更多的精力进行检查。因为数组“slot”类型和长度更容易被人知道。