TypeScript ile açık uçlu işlev argümanları


129

TypeScript dilinin ana endişelerinden biri olan IMO, mevcut vanilya JavaScript kodunu desteklemektir. İlk bakışta edindiğim izlenim buydu. Tamamen geçerli olan aşağıdaki JavaScript işlevine bir göz atın:

Not: Bu yaklaşımı sevdiğimi söylemiyorum. Sadece bunun geçerli bir JavaScript kodu olduğunu söylüyorum.

function sum(numbers) { 

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

    return agregatedNumber;
}

Dolayısıyla, bu işlevi herhangi bir sayıda argümanla tüketiriz:

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

Ancak bunu TypeScript Playground ile denediğimde derleme zamanı hataları veriyor.

Bunun bir hata olduğunu varsayıyorum. Uyumluluk sorunumuz olmadığını varsayalım. Öyleyse, bu tür işlevleri açık uçlu argümanlarla yazmanın bir yolu var mı? paramsC #'daki özellik gibi mi?


2
Merak ediyorum, neden adlandırılmış bir numbersparametreniz var? Onunla hiçbir şey yapmıyorsun.
Justin Morgan

1
@JustinMorgan'ın en az bir parametreye sahip olması, Intellisense'in en azından bazı argümanlar olması gerektiğini ima etmesini sağlar.
drzaus

Yanıtlar:


269

Bunu yapmanın TypeScript yolu, üç nokta operatörünü ( ...) argümanın adının önüne yerleştirmektir. Yukarıdakiler şu şekilde yazılacaktır:

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

Bu daha sonra doğru şekilde kontrol yazacaktır.

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

Harika! Teşekkürler. Bu kesinlikle gitmenin yoludur. Yani birisinin sorumda olduğu gibi mevcut bir kodu varsa, kırılacaktır. Sağ?
tugberk

1
Evet. Çağrı hakkında şikayette bulunur, ancak imzayı sum (...) olarak değiştirerek herhangi bir türden birden fazla parametreyi kabul ediyormuş gibi toplamı bildirebilirsiniz ve hatayı susturur. Lütfen bunu CodePlex'e hata olarak göndermekten çekinmeyin.
chuckj

1
Bir dinlenme parametresi örneği arıyordu. Ty.
AM

6

@Chuckj cevabına ek olarak: TypeScript'te de kullanabilirsiniz arrow function expression( lambdaJava / .NET'te bir türdür )

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

4

Typescript'te Rest Parametresi kavramıdır, benzer tipte birden fazla değer alan parametredir. Typcript'i hedeflersek ECMAScript 6 standardını yazmamız gerekir, o zaman typcript transpiler onu eşdeğer java script koduna dönüştürür ( hangi ECMAScript 5 böyle fonksiyon toplamı olarak, restparameter değişken adıyla preferx) ... üç nokta (kullanmak zorunda ardından typescript kullanmak .Eğer standart) (... numaraları: sayı []), o zaman çalışacak.

Not: Rest Parametresi, parametre list.likewise fonksiyon toplamındaki son parametre olmalıdır (ad: dize, yaş: sayı, ... sayılar: sayı []).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.