offene Funktionsargumente mit TypeScript

127

IMO, eines der Hauptanliegen der TypeScript- Sprache ist die Unterstützung des vorhandenen Vanilla-JavaScript-Codes. Dies ist der Eindruck, den ich auf den ersten Blick hatte. Schauen Sie sich die folgende JavaScript-Funktion an, die vollkommen gültig ist:

Hinweis: Ich sage nicht, dass mir dieser Ansatz gefällt. 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;
}

Wir verwenden diese Funktion also mit einer beliebigen Anzahl von Argumenten:

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

Wenn ich dies jedoch mit TypeScript Playground ausprobiere, treten Fehler bei der Kompilierung auf.

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 paramsFeature in C #?

Tugberk
quelle
2
Nur neugierig, warum hast du überhaupt einen benannten numbersParameter? Du machst nichts damit.
Justin Morgan
1
@JustinMorgan mit mindestens einem Parameter lässt Intellisense zumindest andeuten, dass es einige Argumente geben sollte.
Drzaus

Antworten:

267

Die TypeScript-Methode besteht darin, den Auslassungsoperator ( ...) vor dem Namen des Arguments zu platzieren. Das obige würde geschrieben werden als,

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

Dies wird dann check korrekt mit eingeben

console.log(sum(1, 5, 10, 15, 20));
chuckj
quelle
Toll! Vielen Dank. Dies ist definitiv der richtige Weg. Wenn also jemand wie in meiner Frage einen vorhandenen Code hat, wird dieser kaputt gehen. Richtig?
Tugberk
1
Ja. Es beschwert sich über den Aufruf, aber Sie können die Summe als Akzeptieren mehrerer Parameter eines beliebigen Typs deklarieren, indem Sie stattdessen die Signatur in sum (...) ändern und den Fehler beheben. Bitte zögern Sie nicht, dies als Fehler in CodePlex einzureichen.
Chuckj
1
Ich suchte nach einem Beispiel für einen Ruheparameter. Ty.
AM
5

Zusätzlich zu @chuckj Antwort: Sie können auch ein arrow function expressionin TypeScript verwenden (ist eine Art lambdain Java / .NET)

function sum(...nums: number[]): number {
    return nums.reduce((a, b) => a + b, 0);
}
Jeroen van Dijk-Jun
quelle
4

In Typescript ist es das Konzept des Rest-Parameters , es ist der Parameter, der mehrere Werte ähnlichen Typs empfängt. Wenn wir auf das Typoskript abzielen, müssen wir den Code ECMAScript 6 schreiben , dann konvertiert der Typoskript-Transpiler ihn in seinen entsprechenden Java-Skriptcode ( Dies ist der ECMAScript 5- Standard. Wenn wir Typoskript verwenden, müssen wir drei Punkte (...) Preferx mit dem Namen der Restparameter-Variablen verwenden, z. B. Funktionssumme (... Zahlen: Nummer []), dann würde es funktionieren.

Hinweis: Der Rest-Parameter muss der letzte Parameter in der Parameterliste sein. Ebenso Funktionssumme (Name: Zeichenfolge, Alter: Nummer, ... Nummern: Nummer []).

Sheo Dayal Singh
quelle