2012-10-02 12 views
75

IMO, eines der Hauptanliegen der TypeScript Sprache ist die Unterstützung des vorhandenen JavaScript-Vanilla-Code. Das ist der Eindruck, den ich auf den ersten Blick hatte. Sehen Sie sich die folgende JavaScript-Funktion an, die absolut gültig ist:open-ended Funktionsargumente mit TypeScript

Hinweis: Ich sage nicht, dass ich diesen Ansatz mag. Ich sage nur, dass dies ein gültiger JavaScript-Code ist.

function sum(numbers) { 

    var agregatedNumber = 0; 
    for(var i = 0; i < arguments.length; i++) { 
     agregatedNumber += arguments[i]; 
    } 

    return agregatedNumber; 
} 

So verbrauchen wir diese Funktion mit einer beliebigen Anzahl von Argumenten:

console.log(sum(1, 5, 10, 15, 20)); 

Allerdings, wenn ich diese ausprobieren mit TypeScript Playground, ist es Zeit Kompilierungsfehler gibt.

Ich gehe davon aus, dass dies ein Fehler ist. Nehmen wir an, wir haben keine Kompatibilitätsprobleme. Gibt es dann eine Möglichkeit, diese Art von Funktionen mit offenen Argumenten zu schreiben? Wie params Feature in C#?

+0

Nur neugierig, warum haben Sie sogar einen benannten 'Zahlen' Parameter? Du tust nichts damit. –

+0

@ JustinMorgan mit mindestens einem Parameter lässt Intellisense zumindest darauf hinweisen, dass es einige Argumente geben sollte. – drzaus

Antwort

183

Der TypeScript-Weg, dies zu tun, ist, den Ellipsenoperator (...) vor dem Namen des Arguments zu platzieren. Die oben würde geschrieben werden,

function sum(...numbers: number[]) { 
    var aggregateNumber = 0; 
    for (var i = 0; i < numbers.length; i++) 
     aggregateNumber += numbers[i]; 
    return aggregateNumber; 
} 

Dies wird geben Sie dann richtig überprüfen mit

console.log(sum(1, 5, 10, 15, 20)); 
+0

Großartig! Vielen Dank. Dies ist definitiv der Weg zu gehen. Also, wenn jemand einen existierenden Code wie in meiner Frage hat, wird er brechen. Recht? – tugberk

+1

Ja. Es beschwert sich über den Aufruf, aber Sie können die Summe so definieren, dass sie mehrere Parameter eines beliebigen Typs akzeptiert, indem Sie die Signatur in sum (...) ändern und stattdessen den Fehler stillen. Bitte zögern Sie nicht, dies als Bug auf CodePlex zu übermitteln. – chuckj

+1

War auf der Suche nach einem Beispiel für einen Ruheparameter. Ty. –

2

Zusätzlich Antwort auf @chuckj: Sie können auch einen Lambda-Ausdruck in Typoskript verwenden

function sum(...nums: number[]): number { 
    return nums.reduce((a, b) => a + b, 0); 
} 
Verwandte Themen