Tuples
Normalmente um array contém de zero à muitos objetos de
um mesmo tipo. O TypeScript possui uma análise especial
sobre arrays que contêm múltiplos tipos, e quando a ordem
em que eles estão indexados é importante.
Esses são chamados de tuplas. Pense nelas como uma forma para
conectar dados, mas com menos sintaxe que os objetos.
Você pode criar uma tupla usando a sintaxe de um array do JavaScript:
// Se você passar o mouse sobre o nome das duas variáveis
você pode ver a diferença entre um array ( (string | number)[] )
e uma tupla ( [string, number] ).
Em um array a ordem não é importante, então um item em
qualquer posição poderia ser tanto uma string quanto um
número. Em uma tupla, a ordem e o comprimento são garantidos.
const ResponseFalha = ["Não Encontrado", 404];
// mas você precisa declarar o seu tipo como uma tupla.
const ResponseExitosa: [string, number] = ["{}", 200];
// Isso significa que o TypeScript irá prover a tipagem
correta na posição certa, e até lançar um erro se você
tentar acessar um objeto em uma posição não declarada.
if (ResponseExitosa[1] === 200) {
const InformacaoLocal = JSON.parse(ResponseExitosa[0]);
console.log(InformacaoLocal);
}
// Uma tupla pode ser um bom padrão para pequenos pedaços
de dados conectados ou para fixtures.
ResponseExitosa[2];
// Quando você tem um conjunto de tipos conhecidos no começo
de uma tupla e então várias posições com tipos desconhecidos,
você pode usar o spread operator para indicar que ela pode
ter qualquer comprimento e as posições adicionais serão de algum
tipo específico.
type ContaDeFuncionario = [number, string, string, string?];
const funcionarios: ContaDeFuncionario[] = [
[0, "Adankwo", "adankwo.e@"],
[1, "Kanokwan", "kanokwan.s@"],
[2, "Aneurin", "aneurin.s@", "Supervisor"],
];
// Você pode usar tuplas para descrever funções
que recebem uma quantidade indefinida de parâmetros tipados:
type ComprovantesDePagamento = [ContaDeFuncionario, ...number[]];
const comprovantesDePagamento: ComprovantesDePagamento[] = [
[funcionarios[0], 250],
[funcionarios[1], 250, 260],
[funcionarios[0], 300, 300, 300],
];
const pagamentosDoMesUm = comprovantesDePagamento[0][1] + comprovantesDePagamento[1][1] + comprovantesDePagamento[2][1];
const pagamentosDoMesDois = comprovantesDePagamento[1][2] + comprovantesDePagamento[2][2];
const pagamentosDoMesTres = comprovantesDePagamento[2][2];
//
https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-0.html#tuples-in-rest-parameters-and-spread-expressions
https://auth0.com/blog/typescript-3-exploring-tuples-the-unknown-type/
declare function calcularPagamentoParaEmpregado(id: number, ...args: [...number[]]): number;
calcularPagamentoParaEmpregado(funcionarios[0][0], comprovantesDePagamento[0][1]);
calcularPagamentoParaEmpregado(funcionarios[1][0], comprovantesDePagamento[1][1], comprovantesDePagamento[1][2]);