argomenti di funzione aperta con TypeScript


128

IMO, una delle principali preoccupazioni del linguaggio TypeScript è supportare il codice JavaScript vanilla esistente. Questa è l'impressione che ho avuto a prima vista. Dai un'occhiata alla seguente funzione JavaScript che è perfettamente valida:

Nota: non sto dicendo che mi piace questo approccio. Sto solo dicendo che questo è un codice JavaScript valido.

function sum(numbers) { 

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

    return agregatedNumber;
}

Quindi, utilizziamo questa funzione con un numero qualsiasi di argomenti:

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

Tuttavia, quando provo questo con TypeScript Playground , dà errori in fase di compilazione.

Suppongo che questo sia un bug. Supponiamo di non avere problemi di compatibilità. Quindi, c'è un modo per scrivere questo tipo di funzioni con argomenti aperti? Come paramsfunzionalità in C #?


2
Solo curioso, perché hai anche un numbersparametro con nome ? Non ci stai facendo niente.
Justin Morgan il

1
@JustinMorgan avendo almeno un parametro consente a Intellisense almeno di suggerire che dovrebbero esserci alcuni argomenti.
drzaus

Risposte:


268

Il modo in cui viene eseguito da TypeScript è inserire l'operatore con i puntini di sospensione ( ...) prima del nome dell'argomento. Quanto sopra sarebbe scritto come,

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

Questo quindi digiterà correttamente il controllo con

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

Grande! Grazie. Questa è sicuramente la strada da percorrere. Quindi, se qualcuno ha un codice esistente come nella mia domanda, si romperà. Destra?
tugberk

1
Sì. Si lamenta della chiamata ma puoi dichiarare sum come accettante più parametri di qualsiasi tipo cambiando la firma in sum (...) invece un calmerà l'errore. Non esitare a inviarlo come bug su CodePlex.
chuckj

1
Stavo cercando un esempio di parametro di riposo. Ty.
AM

5

Oltre alla risposta @chuckj: puoi anche usare un arrow function expressionin TypeScript (è una specie di lambdain Java / .NET)

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

4

In Typescript è il concetto di Rest Parameter , è il parametro che riceve più valori di tipo simile.Se targetizziamo il typescript, dobbiamo scrivere il codice ECMAScript 6 standard, quindi typescript transpiler lo converte nel suo codice java script equivalente ( che è ECMAScript 5 standard ). Se usiamo il dattiloscritto allora dobbiamo usare tre punti (...) preferx con il nome della variabile restparameter, come la funzione sum (... numbers: number []), allora funzionerebbe.

Nota: il parametro Rest deve essere l'ultimo parametro nell'elenco dei parametri. Analogamente alla funzione sum (nome: stringa, età: numero, ... numeri: numero []).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.