Búsqueda de sitios web

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