typescript - Retorno implícito o explícito para una función de identidad de mutación
Tengo el deseo de permitir que los usuarios compongan funciones de mutación antes de que el estado que están mutando esté realmente disponible y he creado una función de orden superior llamada MutationIdentity:
type MutationIdentity<T, P extends any[]> = (state: T) => (...args: P) => T;
Esto expresa un tipo que representa tanto el estado T que está siendo mutado como los parámetros P en la función interna. Aunque considero que es una expresión útil de la forma prevista de la mutación de identidad (perdón si este lenguaje funcional es impreciso... soy relativamente nuevo en la terminología), no puede inferirse directamente debido a limitaciones de Typescript.
Así que para la construcción de estas mutaciones de identidad, he ideado la siguiente función:
function MutationIdentity<T>() {
return function <M extends MutationIdentity<T, P>, P extends any[]>(mutationFn: M) {
return mutationFn;
};
}
Esto permite la construcción fuertemente tipada de estas funciones y devuelve una representación implícita del tipo MutationIdentity mencionado anteriormente:
type State = { foo: number, bar: number };
const incr = MutationIdentity<State>()(
s => (foo: number) => ({ ...s, foo: s.foo++ })
);
Tengo dos preguntas, pero la pregunta principal es esta ... ¿sería mejor que esta función devolviera una representación explícita de MutationIdentity<T,P> o se prefiere implícita? ¿Es esto posible?
Solo para aclarar, la función incr definida arriba se puede tipar explícitamente de la siguiente manera:
const incr: MutationIdentity<State, [number]> = MutationIdentity<State>()(
s => (foo: number) => ({ ...s, foo: s.foo++ })
);
y esto no causa problemas de escritura, pero es que el tipo no se está convirtiendo a esta forma explícita actualmente.
La pregunta secundaria es más estilística, pero ... ¿la gente cree que la definición de un tipo y función que comparten el nombre MutationIdentity es un olor a código o está bien? Nombrar es difícil y la función devuelve el tipo con el mismo nombre. De todos modos, me interesan las opiniones sobre esto.
El código completo, incluyendo las pruebas de tipado, se puede encontrar en este playground