ProgramaciónDesarrollador Fullstack

¿Cómo implementar y tipificar correctamente una función de callback con parámetros que pueden ser opcionales o tener valores predeterminados? ¿Qué dificultades pueden surgir y cómo evitarlas?

Supere entrevistas con el asistente de IA Hintsage

Respuesta.

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:

  • Para los parámetros opcionales se utiliza el signo "?".
  • Para los valores por defecto se indica el valor por defecto en la definición de la función.
  • La tipificación facilita el mantenimiento del código y reduce la cantidad de errores.

Preguntas capciosas.

¿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.

Errores comunes y anti-patrones

  • Romper el orden de parámetros opcionales y obligatorios (primero los obligatorios, luego los opcionales).
  • Falta de indicación explícita de tipos o uso de "any" — lo que provoca la pérdida de las ventajas de TypeScript.
  • Intentos de pasar undefined en lugar de un valor y esperar la activación del valor por defecto (solo se activa cuando falta el argumento).

Ejemplo de la vida real

Caso negativo

Se designó el segundo argumento del callback como obligatorio, y no se pasó en la llamada. Se obtuvo un error de compilación.

Ventajas:

  • Código escrito de manera rápida y simple sin aclaraciones.

Desventajas:

  • No se compila.
  • Pérdida de flexibilidad y responsabilidad confusa.

Caso positivo

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:

  • Garantía de ausencia de errores al llamar a los callbacks.
  • Legibilidad y mantenibilidad.

Desventajas:

  • Se debe tener cuidado con el orden de los parámetros.