Desafio TypeScript
Calculadora com tipo de função
Enunciado
Defina um tipo Operacao que representa uma função que recebe dois números e retorna um número. Crie uma função calcular que recebe uma operação e dois números, e retorna o resultado. Use parâmetros opcionais para permitir uma mensagem de erro personalizada. Teste com soma, subtração e multiplicação.
Requisitos
- O tipo
Operacaodeve ser(a: number, b: number) => number. - A função
calculardeve ter parâmetros:operacao: Operacao,a: number,b: number, e um parâmetro opcionalmensagemErro?: string. - Se
aoubnão forem números, deve lançar um erro com a mensagem fornecida ou uma padrão. - Deve retornar o resultado da operação.
Código inicial
type Operacao = (a: number, b: number) => number;
function calcular(operacao: Operacao, a: number, b: number, mensagemErro?: string): number {
// Seu código aqui
}
Saída esperada
Soma: 5
Subtração: 1
Multiplicação: 6
Erro: Valores inválidos
Ver dica
Use typeof para verificar se os parâmetros são números. Lance um Error com a mensagem apropriada.
Mostrar solução
type Operacao = (a: number, b: number) => number;
function calcular(operacao: Operacao, a: number, b: number, mensagemErro?: string): number {
if (typeof a !== "number" || typeof b !== "number") {
throw new Error(mensagemErro ?? "Valores inválidos");
}
return operacao(a, b);
}
const soma: Operacao = (x, y) => x + y;
const subtracao: Operacao = (x, y) => x - y;
const multiplicacao: Operacao = (x, y) => x * y;
console.log("Soma:", calcular(soma, 2, 3));
console.log("Subtração:", calcular(subtracao, 5, 4));
console.log("Multiplicação:", calcular(multiplicacao, 2, 3));
try {
calcular(soma, "2" as any, 3, "Valores inválidos");
} catch (e) {
console.log("Erro:", (e as Error).message);
}
Passo a passo
- Definimos o tipo
Operacaocomo uma função que recebe dois números e retorna um número. - A função
calcularrecebe umaoperacaodesse tipo, dois númerosaeb, e um parâmetro opcionalmensagemErro. - Verificamos se
aebsão realmente números; se não, lançamos um erro com a mensagem fornecida ou a padrão. - Retornamos o resultado da chamada
operacao(a, b). - Criamos três operações usando arrow functions e as testamos.
- No final, forçamos um erro passando uma string como
apara demonstrar o tratamento.
Por que funciona
O tipo Operacao permite passar qualquer função compatível. A verificação de tipos em tempo de execução (com typeof) complementa a checagem estática do TypeScript. O parâmetro opcional mensagemErro personaliza a mensagem de erro.
Erros comuns
- Não verificar os tipos em tempo de execução:
calcular(soma, "2" as any, 3)– sem a verificação, a operação pode concatenar strings em vez de somar. - Esquecer de tipar a operação:
function calcular(operacao, a, b)– o TypeScript infereany, perdendo a segurança. - Usar
mensagemErrosem??:throw new Error(mensagemErro)– se não for passada, a mensagem ficaundefined.
Outra forma de resolver
Usar um objeto com métodos em vez de funções separadas:
const operacoes = {
soma: (a: number, b: number) => a + b,
subtracao: (a: number, b: number) => a - b,
multiplicacao: (a: number, b: number) => a * b,
};
console.log(calcular(operacoes.soma, 2, 3));
Saída esperada
Soma: 5
Subtração: 1
Multiplicação: 6
Erro: Valores inválidos