TypeScript com funções Promises, Async / Await e Generator

Por alguma razão bizarra, os documentos do TypeScript não explicam como implementar a verificação de tipo para funções Promises, Async / Await ou Generator.

Promises

A solução é bem simples. Basicamente, o tipo de retorno da promessa é definido imediatamente após a Promisepalavra – chave. Por exemplo

const p = new Promise<boolean | string>((resolve, reject) => {
const random = Math.random() * 10;if (random > 5) {
resolve(true);
return;
}reject("It was lower than 5");
});p.catch(err => console.log("ERROR - ", err));

Observe como o rejectretorno de uma String? Bem, apenas adicionamos um tipo de união na declaração de tipo da Promessa e, dessa forma, tanto o tipo de retorno resolvecomo o rejectsão aceitáveis.

Async / Await

A implementação do TypeScript com async/awaité muito semelhante a uma promessa.

const randomAboveFive = () =>
new Promise<boolean | string>((resolve, reject) => {
const random = Math.floor(Math.random() * 15); if (random > 5) {
resolve(true);
return;
} reject("It was lower than 5");
});const checkRandomNumber = async (): Promise<boolean | string> => {
let result; try {
result = await randomAboveFive();
} catch (err) {
console.log("ERROR -- ", err);
result = err;
} console.log("----->>>", result); return result;
};checkRandomNumber();

No código acima, declaramos uma promessa que pode ser aplicada de qualquer maneira – se o valor aleatório gerado estiver acima 5, resolveremos truee, se não for, forneceremos rejectuma string explicando o erro.

Em seguida, configuramos uma função com Async / Await que aguarda a Promise, e lida com o sucesso ou fracasso dela.

Definimos o tipo de retorno da operação Async / Await Promise<boolean | string>.

Functions

Aqui está como implementamos o TypeScript function*, também conhecido como Funções do gerador:

function* genCounter(i: number): IterableIterator<number> {
while (true) {
yield i--; if (i === 0) return;
}
}const count = genCounter(4);let keepGoing = true;while (keepGoing) {
const { value, done } = count.next();
console.log("=>", value, done); if (done) {
keepGoing = false;
}
}

O principal argumento é que, para que as Funções do Gerador funcionem bem com o TypeScript , você deve definir um valor de retorno de IterableIterator<number>, onde numberestá qualquer tipo básico de TypeScript que ele retornar.

O que está acontecendo no código acima:

Declaramos uma Função Geradora que recebe uma numbere então a decrementa toda vez que count.next()é chamada. Se o número chegar a zero, retornamos e paramos o loop e saímos da função do gerador.

Em seguida, declarar um outro ciclo que continua chamando count.next()e registar o produto até que count.next().doneé true.

0 Reviews

Write a Review

Rodrigo Rangel

Read Previous

Postman vs. Insomnia: Comparando as Ferramentas de Teste de API

Read Next

CMS October, alternativa auto-hospedada VS WordPress

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

WhatsApp chat