2015-01-14 2 views
6

Siehe untenWarum schließt Typ nicht? Überprüfen Sie die Parameter, wenn Sie function.apply verwenden?

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

Warum Closure einen Fehler nur, dass erhöhen, wenn Anruf mit und nicht anwenden?
Gibt es eine Möglichkeit, die Art der Schließung Typ-Check die Parameter auch wenn ich benutze anwenden?

+0

Können Sie das Array explizit eingeben? – Bergi

+0

@Bergi wenn es einen Weg gibt es zu tun, ich weiß es nicht. – oldergod

Antwort

2

Weil (a) der Typüberprüfer noch nicht das Konzept eines Tupeltyps hat und (b) es selten ist, eine Methode mit einem Arrayliteral aufzurufen. Bei der Verwendung von .call bestimmt, welches Argument welchem ​​Parameter zugeordnet ist Slot ist trivial.

Wenn das Typsystem einen Tupel-Typ anwachsen lässt, wäre es sinnvoller, mehr Aufwand in die Überprüfung von .apply zu investieren, da die Array- "Slot" -Typen und -Länge eher bekannt sind.

Verwandte Themen