Un programador ha experimentado añadir al compilador de TypeScript una declaración defer inspirada en Go, que retrasa la ejecución de una función hasta que termina la función que la contiene. En Go, este recurso se emplea para vincular la adquisición y la liberación de recursos, por ejemplo al bloquear un semáforo. En TypeScript no existe un equivalente estricto: lo habitual es recurrir a try/finally, una construcción que el autor considera verbosa.
El experimento aprovecha la maquinaria interna del compilador de TypeScript, que ya realiza reescrituras de árbol sintáctico abstracto (AST) para convertir sintaxis moderna en código compatible con versiones antiguas. La idea es traducir cada defer en un fragmento que registre una clausura en una pila interna y la ejecute en orden inverso al salir de la función, replicando la semántica LIFO de Go. Se imponen restricciones como exigir que el operando sea una llamada a función y prohibir defer dentro de generadores.
El artículo aborda decisiones de diseño relevantes: la captura inmediata del receptor, el método y los argumentos, el rechazo de defer await y una política de errores que intenta ejecutar todas las limpiezas, preservar el error original y, si hay varios fallos, devolverlos envueltos en un AggregateError. En funciones asíncronas, las limpiezas se esperan secuencialmente.
El autor concluye que defer no encaja en TypeScript porque las excepciones de JavaScript son flujo de control, no valores como los errores en Go, lo que obliga a definir políticas de agregación y precedencia inexistentes en Go. Como alternativa menciona la propuesta ECMAScript de gestión explícita de recursos, ya disponible con using y Disposable a partir de TypeScript 5.2, que resuelve el mismo problema con semántica estandarizada.
