no entiendo porque da error
function foo(): () => string { return () => 123; }Pero esto no
function foo(): () => void { return () => 123; }Y también esto no dará un error también
function foo(): (a: number) => string { return () => '123'; }Escribo explícitamente que la función devuelta debe aceptar un argumento, luego devuelvo una función que no acepta ninguno, pero TS no me da ningún error.
Asignar una función de tipo () => number a algo de tipo () => string claramente es un error de tipo. Sin embargo, para void como tipo de devolución, TypeScript es más indulgente. Del manual sobre la asignabilidad de funciones :
El tipo de retorno
voidpara funciones puede producir un comportamiento inusual pero esperado.La tipificación contextual con un tipo de retorno de
voidno obliga a las funciones a no devolver algo. Otra forma de decir esto es un tipo de función contextual con un tipo de retornovoid(type vf = () => void), cuando se implementa, puede devolver cualquier otro valor, pero se ignorará.[…]
Hay otro caso especial a tener en cuenta, cuando una definición de función literal tiene un tipo de retorno
void, esa función no debe devolver nada.
También hay una entrada de preguntas frecuentes al respecto.
Mis investigaciones terminaron con el hecho de que es imposible hacer esto con TypesScript, desafortunadamente. Aquí están los enlaces que explican por qué se tomó esta decisión poco intuitiva.
La solución que más se acerca a la funcionalidad deseada es
function foo(): () => undefined { ... }tsconfig.json "compilerOptions": {"noImplicitReturns": false} function foo(): () => undefined { return () => { return; } }Se ve un poco feo pero ahora podemos definir una función que seguro no devolverá nada.