argumen fungsi terbuka dengan TypeScript

128

IMO, salah satu perhatian utama dari bahasa TypeScript adalah untuk mendukung kode JavaScript vanilla yang ada. Ini kesan yang saya rasakan pada pandangan pertama. Lihatlah fungsi JavaScript berikut yang benar-benar valid:

Catatan: Saya tidak mengatakan bahwa saya menyukai pendekatan ini. Saya hanya mengatakan ini adalah kode JavaScript yang valid.

function sum(numbers) { 

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

    return agregatedNumber;
}

Jadi, kami menggunakan fungsi ini dengan sejumlah argumen:

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

Namun, ketika saya mencobanya dengan TypeScript Playground , ini memberikan kesalahan waktu kompilasi.

Saya berasumsi bahwa ini adalah bug. Mari kita asumsikan bahwa kita tidak memiliki masalah kompatibilitas. Lalu, adakah cara untuk menulis jenis fungsi ini dengan argumen terbuka? Seperti paramsfitur di C #?

tugberk
sumber
2
Hanya penasaran, mengapa Anda bahkan memiliki numbersparameter bernama ? Anda tidak melakukan apapun dengannya.
Justin Morgan
1
@JustinMorgan yang memiliki setidaknya satu parameter memungkinkan Intellisense setidaknya memberikan petunjuk bahwa harus ada beberapa argumen.
drzaus

Jawaban:

268

Cara TypeScript melakukan ini adalah dengan menempatkan operator elipsis ( ...) sebelum nama argumen. Di atas akan ditulis sebagai,

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

Ini kemudian akan mengetik cek dengan benar dengan

console.log(sum(1, 5, 10, 15, 20));
chuckj
sumber
Bagus! Terima kasih. Ini pasti cara untuk pergi. Jadi, jika seseorang memiliki kode yang ada seperti dalam pertanyaan saya, itu akan rusak. Baik?
tugberk
1
Iya. Ini mengeluh tentang panggilan tetapi Anda dapat mendeklarasikan sum sebagai menerima beberapa parameter dari jenis apa pun dengan mengubah tanda tangan menjadi sum (...) sebagai gantinya itu akan menenangkan kesalahan. Silakan mengirimkan ini sebagai bug di CodePlex.
chuckj
1
Sedang mencari contoh parameter istirahat. Ty.
Pagi
5

Selain jawaban @chuckj: Anda juga dapat menggunakan arrow function expressiondi TypeScript (semacam a lambdadi Java / .NET)

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

Di Typecript itu adalah konsep Rest Parameter , itu adalah parameter yang menerima banyak nilai dengan tipe yang sama.Jika kita menargetkan typescript maka kita harus menulis kode ECMAScript 6 standar, kemudian transpiler typescript mengubahnya menjadi kode java script yang setara ( yang standar ECMAScript 5 ). Jika kita menggunakan skrip ketikan maka kita harus menggunakan tiga titik (...) preferx dengan nama variabel restparameter, seperti fungsi jumlah (... angka: angka []), maka itu akan berhasil.

Catatan: Parameter Istirahat harus parameter terakhir dalam daftar parameter. Demikian juga jumlah fungsi (nama: string, usia: angka, ... angka: angka []).

Sheo Dayal Singh
sumber