Skip to content

Commit df477d8

Browse files
committed
#20 - typescript
1 parent 5b01497 commit df477d8

File tree

1 file changed

+170
-0
lines changed

1 file changed

+170
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
/**
2+
* Teoría sobre peticiones HTTP en TypeScript:
3+
*
4+
* TypeScript añade tipado estático a JavaScript, lo que nos permite:
5+
* 1. Definir interfaces para las respuestas de la API
6+
* 2. Tener mejor autocompletado y detección de errores en tiempo de compilación
7+
* 3. Hacer el código más mantenible y autodocumentado
8+
*
9+
* Para peticiones HTTP, podemos usar:
10+
* - fetch en navegadores o con 'node-fetch' en Node.js
11+
* - axios como una alternativa más robusta
12+
*
13+
* Este ejemplo usa 'node-fetch' y requiere:
14+
* npm install typescript @types/node node-fetch @types/node-fetch
15+
*/
16+
17+
import fetch from "node-fetch";
18+
import * as readline from "readline";
19+
20+
// Interfaces para tipar las respuestas de la API
21+
interface Pokemon {
22+
name: string;
23+
id: number;
24+
weight: number;
25+
height: number;
26+
types: Array<{
27+
type: {
28+
name: string;
29+
};
30+
}>;
31+
game_indices: Array<{
32+
version: {
33+
name: string;
34+
};
35+
}>;
36+
species: {
37+
url: string;
38+
};
39+
}
40+
41+
interface PokemonSpecies {
42+
evolution_chain: {
43+
url: string;
44+
};
45+
}
46+
47+
interface EvolutionChain {
48+
chain: ChainLink;
49+
}
50+
51+
interface ChainLink {
52+
species: {
53+
name: string;
54+
};
55+
evolves_to: ChainLink[];
56+
}
57+
58+
// Configuración de readline para entrada/salida en consola
59+
const rl = readline.createInterface({
60+
input: process.stdin,
61+
output: process.stdout,
62+
});
63+
64+
// Función para realizar preguntas al usuario y obtener respuesta
65+
function pregunta(pregunta: string): Promise<string> {
66+
return new Promise((resolve) => {
67+
rl.question(pregunta, resolve);
68+
});
69+
}
70+
71+
// Función genérica para realizar peticiones HTTP
72+
async function hacerPeticionHttp<T>(url: string): Promise<T> {
73+
try {
74+
const respuesta = await fetch(url);
75+
if (!respuesta.ok) {
76+
throw new Error(`HTTP error! status: ${respuesta.status}`);
77+
}
78+
return (await respuesta.json()) as T;
79+
} catch (error) {
80+
throw new Error(
81+
`Error al realizar la petición: ${
82+
error instanceof Error ? error.message : "Unknown error"
83+
}`
84+
);
85+
}
86+
}
87+
88+
// Función para mostrar la cadena de evolución
89+
function mostrarCadenaEvolucion(cadena: ChainLink, nivel: number = 0): void {
90+
const indentacion = " ".repeat(nivel);
91+
console.log(`${indentacion}- ${cadena.species.name}`);
92+
93+
if (cadena.evolves_to.length > 0) {
94+
for (const evolucion of cadena.evolves_to) {
95+
mostrarCadenaEvolucion(evolucion, nivel + 1);
96+
}
97+
}
98+
}
99+
100+
// Función principal que ejecuta el programa
101+
async function main(): Promise<void> {
102+
console.log("=== Ejemplo básico de petición HTTP ===");
103+
try {
104+
await hacerPeticionHttp("https://www.example.com");
105+
console.log("Petición exitosa a example.com");
106+
} catch (error) {
107+
console.error(error instanceof Error ? error.message : "Unknown error");
108+
}
109+
110+
while (true) {
111+
console.log("\n=== Búsqueda de Pokémon ===");
112+
const entrada = await pregunta(
113+
"Ingrese el nombre o número del Pokémon (o 'salir' para terminar): "
114+
);
115+
116+
if (entrada.toLowerCase() === "salir") {
117+
break;
118+
}
119+
120+
try {
121+
// Obtener datos básicos del Pokémon
122+
const pokemonData = await hacerPeticionHttp<Pokemon>(
123+
`https://pokeapi.co/api/v2/pokemon/${entrada.toLowerCase()}`
124+
);
125+
126+
console.log("\nInformación del Pokémon:");
127+
console.log(`Nombre: ${pokemonData.name}`);
128+
console.log(`ID: ${pokemonData.id}`);
129+
console.log(`Peso: ${pokemonData.weight / 10} kg`);
130+
console.log(`Altura: ${pokemonData.height / 10} m`);
131+
132+
console.log("Tipos:");
133+
pokemonData.types.forEach((tipo) => {
134+
console.log(`- ${tipo.type.name}`);
135+
});
136+
137+
// Obtener y mostrar cadena de evolución
138+
const speciesData = await hacerPeticionHttp<PokemonSpecies>(
139+
pokemonData.species.url
140+
);
141+
const evolutionData = await hacerPeticionHttp<EvolutionChain>(
142+
speciesData.evolution_chain.url
143+
);
144+
145+
console.log("\nCadena de evolución:");
146+
mostrarCadenaEvolucion(evolutionData.chain);
147+
148+
// Mostrar juegos
149+
console.log("\nJuegos en los que aparece:");
150+
pokemonData.game_indices.forEach((juego) => {
151+
console.log(`- ${juego.version.name}`);
152+
});
153+
} catch (error) {
154+
console.error(
155+
"Error: No se pudo encontrar el Pokémon. Asegúrese de escribir el nombre o número correctamente."
156+
);
157+
}
158+
}
159+
160+
rl.close();
161+
}
162+
163+
// Ejecutar el programa
164+
main().catch((error) => {
165+
console.error(
166+
"Error en la ejecución del programa:",
167+
error instanceof Error ? error.message : "Unknown error"
168+
);
169+
process.exit(1);
170+
});

0 commit comments

Comments
 (0)