argumentos de função em aberto com TypeScript

127

Na IMO, uma das principais preocupações da linguagem TypeScript é oferecer suporte ao código JavaScript baunilha existente. Essa é a impressão que tive à primeira vista. Dê uma olhada na seguinte função JavaScript, que é perfeitamente válida:

Nota: não estou dizendo que gosto dessa abordagem. Estou apenas dizendo que este é um código JavaScript válido.

function sum(numbers) { 

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

    return agregatedNumber;
}

Portanto, consumimos essa função com qualquer número de argumentos:

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

No entanto, quando tento fazer isso com o TypeScript Playground , ele gera erros em tempo de compilação.

Estou assumindo que isso é um bug. Vamos supor que não temos os problemas de compatibilidade. Então, existe alguma maneira de escrever esse tipo de função com argumentos abertos? Como paramsrecurso em c #?

tugberk
fonte
2
Apenas curioso, por que você ainda tem um numbersparâmetro nomeado ? Você não está fazendo nada com isso.
Justin Morgan
1
@JustinMorgan, tendo pelo menos um parâmetro, permite ao Intellisense pelo menos sugerir que deve haver alguns argumentos.
drzaus

Respostas:

267

A maneira TypeScript de fazer isso é colocar o operador de reticências ( ...) antes do nome do argumento. O texto acima seria escrito como,

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

Isso digitará verificação corretamente com

console.log(sum(1, 5, 10, 15, 20));
chuckj
fonte
Ótimo! obrigado. Este é definitivamente o caminho a seguir. Portanto, se alguém tiver um código existente, como na minha pergunta, ele será quebrado. Certo?
Tugberk 02/10/12
1
Sim. Ele reclama da chamada, mas você pode declarar soma como aceitando vários parâmetros de qualquer tipo, alterando a assinatura para soma (...) em vez disso, e isso acalmará o erro. Por favor, sinta-se à vontade para enviar isso como um bug no CodePlex.
21312 chuckj #
1
Estava procurando um exemplo de parâmetro de descanso. Ty.
AM
5

Além da resposta @chuckj: Você também pode usar um arrow function expressionem TypeScript (é tipo um lambdaem Java / .NET)

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

No Typescript, é o conceito de Rest Parameter , é o parâmetro que recebe vários valores do tipo semelhante. Se segmentarmos o datilografado, precisaremos escrever o código ECMAScript 6 standard, o transpiler de datilografia o converterá em seu código de script java equivalente ( que é o ECMAScript 5 padrão ). Se usarmos texto datilografado, teremos que usar três pontos (...) preferx com o nome da variável restparameter, como a função sum (... numbers: number []), funcionaria.

Nota: Rest Parameter deve ser o último parâmetro na lista de parâmetros. Função da mesma forma soma (nome: string, idade: número, ... number: number []).

Sheo Dayal Singh
fonte