2015-01-14 15 views
6

Vedi sottoPerché non chiude il tipo-controllare i parametri quando si utilizza function.apply?

/** 
* @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 
} 

Perché chiusura genera un errore solo quando si utilizza chiamata e non si applica?
C'è un modo per rendere possibile il tipo di chiusura: controllare i parametri anche quando sto usando apply?

+0

È possibile digitare l'array in modo esplicito? – Bergi

+0

@Bergi se c'è un modo per farlo, non lo so. – oldergod

risposta

2

Perché (a) il controllo di tipo non ha ancora il concetto di un tipo di tupla e (b) è raro chiamare un metodo con un letterale di matrice. Quando si usa .call determinare quale argomento è assegnato a quale slot di parametro è banale.

Se il sistema di tipi cresce di un tipo di tupla, sarebbe sensato mettere più impegno nel controllare .applicare come è più probabile che i tipi di "slot" dell'array e la lunghezza siano più noti.