flowtype - Migrando de Flow a TypeScript: ¿equivalente de $Call<F, T...> en TS?
Flow tiene el práctico tipo de utilidad $Call<F, T...> que puede obtener el tipo de retorno al llamar a la función de tipo F con el primer argumento (opcional) como tipo T, el segundo argumento y así sucesivamente. Así que podemos hacer:
type First = <T>(Array<T>) => T | void;
type ShouldBeOptionalString = $Call<First, Array<string>>; // ShouldBeOptionalString is string | void
¿Puede TypeScript lograr la funcionalidad equivalente? Conozco el tipo de utilidad ReturnType<T> proporcionado por TypeScript, pero no puede calcular el tipo de retorno basado en el tipo de argumento:
type First = <T>(arg0: Array<T>) => T | void;
type WhatWillThisBe = ReturnType<First>; // WhatWillThisBe will be unknown
Intenté crear mi propia versión de ReturnType que intenta inferir el tipo de retorno con los argumentos dados, pero no tuve suerte:
type CallWithArgsReturnType<T extends (...args: any) => any, A extends Array<any>> = T extends ((...args: A) => infer R) ? R : never;
type ShouldBeOptionalString = CallWithArgsReturnType<First, [Array<string>]>; // ShouldBeOptionalString will be unknown
Respuesta #1
Creo que para lograr algo como esto, tendrás que hacer que el tipo sea genérico, y supongo que un genérico separado para cada argumento:
type First<T = any> = (arg0: T[]) => T | void;
type WhatWillThisBe = ReturnType<First<string>>; // string | void
Si también quieres que la función sea genérica, lo cual entiendo, puedes hacer esto:
type First<T = any> = <U extends T>(arg0: Array<U>) => U | void;
type WhatWillThisBe = ReturnType<First<string>>; // string | void
