otwarte argumenty funkcji z TypeScript

131

IMO, jednym z głównych problemów języka TypeScript jest obsługa istniejącego zwykłego kodu JavaScript. Takie wrażenie miałem na pierwszy rzut oka. Spójrz na następującą funkcję JavaScript, która jest całkowicie poprawna:

Uwaga: nie mówię, że podoba mi się to podejście. Mówię tylko, że to poprawny kod JavaScript.

function sum(numbers) { 

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

    return agregatedNumber;
}

Tak więc używamy tej funkcji z dowolną liczbą argumentów:

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

Jednak kiedy wypróbowuję to z TypeScript Playground , daje to błędy czasu kompilacji.

Zakładam, że to błąd. Załóżmy, że nie mamy problemów ze zgodnością. W takim razie, czy istnieje sposób na napisanie tego typu funkcji z otwartymi argumentami? Takich jak paramsfunkcja w C #?

tugberk
źródło
2
Ciekawe, dlaczego w ogóle masz nazwany numbersparametr? Nic z tym nie robisz.
Justin Morgan
1
@JustinMorgan posiadanie co najmniej jednego parametru pozwala Intellisense przynajmniej zasugerować, że powinno być kilka argumentów.
drzaus

Odpowiedzi:

271

Sposób na to w języku TypeScript polega na umieszczeniu operatora wielokropka ( ...) przed nazwą argumentu. Powyższe byłoby zapisane jako:

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

Spowoduje to poprawne wpisanie polecenia

console.log(sum(1, 5, 10, 15, 20));
chuckj
źródło
Wspaniały! dzięki. To jest zdecydowanie droga. Czyli jak ktoś ma już kod jak w moim pytaniu to się zepsuje. Dobrze?
tugberk
1
Tak. Narzeka na wywołanie, ale możesz zadeklarować sumę jako akceptującą wiele parametrów dowolnego typu, zmieniając podpis na sumę (...) zamiast tego uśmierzy błąd. Prosimy o przesłanie tego jako błędu w CodePlex.
chuckj
1
Szukałem przykładu parametru odpoczynku. Ty.
AM
6

Oprócz odpowiedzi @chuckj: Możesz również użyć arrow function expressionw TypeScript (jest to coś w rodzaju a lambdaw Javie / .NET)

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

W Typescript jest to koncepcja Rest Parameter , jest to parametr, który otrzymuje wiele wartości podobnego typu.Jeśli kierujemy na maszynopis, to musimy napisać kod ECMAScript 6 w standardzie, a następnie transpiler TypeScript konwertuje go na odpowiadający mu kod skryptu java ( który jest standardem ECMAScript 5 ) .Jeśli używamy maszynopisu, to musimy użyć trzech kropek (...) preferx z nazwą zmiennej restparameter, takiej jak function sum (... numbers: number []), wtedy to zadziała.

Uwaga: Parametr Reszta musi być ostatnim parametrem na liście parametrów. Podobnie jak funkcja suma (nazwa: łańcuch, wiek: liczba, ... liczby: liczba []).

Sheo Dayal Singh
źródło