Búsqueda de sitios web

Typescript ReturnType con funciones anidadas


Estoy intentando usar ReturnType para generar un tipo que dependa de los tipos de retorno de las funciones que viven en un objeto.

Aquí está el objeto:

const foo = {
  bar: (): number => 1,
  quux: (): string => 'a',
};

El tipo resultante deseado es:

type FooLeaves = {
  bar: number;
  quux: string;
};

¿Es posible aplicar un ResultType a los valores del objeto para extraer los tipos de retorno de las funciones anidadas?

Supongo que podría invocar cada valor y tomar su tipo, pero parece una solución chapucera

Respuesta #1

Es bastante sencillo usar tipos mapeados:

type FooLeaves = { [K in keyof typeof foo]: ReturnType<typeof foo[K]> };

Esto es equivalente a

type FooLeaves = {
  bar: number;
  quux: string;
};

Si quisieras una solución más genérica, podrías usar tipos condicionales para crear algo como esto:

type ResultsOf<T> = { [K in keyof T]: T[K] extends (...args: any) => infer R ? R : T[K] }

Esto también manejará los casos en los que mezclas funciones y valores regulares, por ejemplo:

const foo = {
  bar: (): number => 1,
  quux: 'a',
};

type FooLeaves = ResultsOf<typeof foo>; // { bar: number, quux: string }

Artículos relacionados