Considere o seguinte cenário de desenvolvimento de um sistema de controle de transações financeiras para a SEFAZ Nacional, implementado em TypeScript. A equipe precisa garantir a integridade dos dados e a consistência das operações, mesmo diante de falhas parciais. Para isso, foram definidos os seguintes tipos e funções:
type Resultado<T, E = Error> = { sucesso: true; valor: T } | { sucesso: false; erro: E };
async function executarTransacao<T>(operacao: () => Promise<T>): Promise<Resultado<T>> {
try {
const valor = await operacao();
return { sucesso: true, valor };
} catch (e) {
return { sucesso: false, erro: e instanceof Error ? e : new Error(String(e)) };
}
}
async function transferirFundos(origem: string, destino: string, valor: number): Promise<Resultado<string>> {
return executarTransacao(async () => {
const saldoOrigem = await consultarSaldo(origem);
if (saldoOrigem < valor) {
throw new Error('Saldo insuficiente');
}
await debitar(origem, valor);
await creditar(destino, valor);
return `Transferencia de ${valor} concluida`;
});
}
// Uso:
const resultado = await transferirFundos('A', 'B', 1000);
if (resultado.sucesso) {
console.log(resultado.valor);
} else {
console.error(resultado.erro.message);
}Considerando as características da linguagem TypeScript e as boas práticas de tratamento de erros e assincronismo, analise as afirmativas a seguir:
I. A função executarTransacao garante que qualquer exceção lançada dentro da operação assíncrona seja capturada e convertida em um objeto Error, assegurando que o tipo de retorno seja sempre um Resultado<T> com a propriedade erro do tipo Error.
II. O uso do tipo união discriminada Resultado<T, E> permite que o compilador TypeScript faça narrowing (estreitamento) de tipo com base na propriedade sucesso, garantindo que, no bloco if (resultado.sucesso), o acesso a resultado.valor seja seguro e que, no bloco else, o acesso a resultado.erro também seja seguro.
III. A função transferirFundos realiza as operações de débito e crédito de forma atômica, pois, caso ocorra um erro após o débito, o crédito não será executado e a transação será revertida automaticamente pelo runtime do TypeScript.
IV. Se a função consultarSaldo lançar uma exceção do tipo string (por exemplo, throw 'Falha na consulta'), a função executarTransacao irá capturá-la e retornar um Resultado com sucesso: false e erro sendo uma instância de Error cuja mensagem é 'Falha na consulta'.
Estão corretas apenas as afirmativas:
Selecione uma alternativa pra criar sua conta e salvar o progresso.