Historia de la pregunta:
Las funciones de callback son una práctica común en JS y TS para programación asíncrona y delegación de responsabilidades. En TypeScript, la tipificación de tales funciones es una parte importante para garantizar la seguridad, especialmente si los parámetros pueden ser opcionales o tener valores por defecto.
Problema:
En el JS dinámico, la falta de tipificación de los argumentos de la callback conduce a errores en la transferencia de valores, confusiones con undefined y un orden incorrecto de los parámetros. En TypeScript, la tipificación es necesaria para evitar problemas similares, pero desde afuera es difícil cumplir con todos los matices relacionados con la opcionalidad, el orden y los valores por defecto.
Solución:
Especificar explícitamente los tipos de todos los parámetros, indicar los parámetros opcionales con un signo de interrogación, y proporcionar los valores por defecto directamente en la declaración de la función, asegurándose de describirlos correctamente en el tipo.
Ejemplo de código:
function fetchData( url: string, callback: (data: any, error?: Error) => void ) { // ... } // Callback con parámetro opcional error fetchData('/api', (data, error) => { if (error) { // manejo } else { // éxito } }); // Callback con parámetro por defecto function process( cb: (x: number, y?: number) => void = (x, y = 10) => { /* ... */ } ) { /* ... */ }
Características clave:
¿Está obligado el consumidor del callback a tener en cuenta todos los parámetros, incluidos los opcionales?
No, puede omitir los parámetros opcionales, y TypeScript no generará un error; el manejo se realiza correctamente gracias a la sintaxis del signo de interrogación.
¿Es posible hacer que el primer parámetro en el callback sea opcional y el segundo obligatorio?
No. Los parámetros opcionales siempre deben estar al final de la lista de argumentos. Romper el orden provocará un error de tipificación.
¿Qué sucederá si no se indica la opcionalidad de un parámetro, pero no se pasa en el momento de la llamada?
TypeScript generará un error; si el parámetro es obligatorio, debe ser pasado. Solo los parámetros opcionales o con valores por defecto pueden ser omitidos.
Se designó el segundo argumento del callback como obligatorio, y no se pasó en la llamada. Se obtuvo un error de compilación.
Ventajas:
Desventajas:
Se tipificó el callback con un parámetro opcional:
(cb: (x: number, y?: number) => void)
O se proporcionó un valor por defecto:
f = (x: number, y = 10) => { ... }
Ventajas:
Desventajas: