web-dev-qa-db-fra.com

Type de retour typographique de la fonction générique

Le nouveau ReturnType in TypeScript 2.8 est une fonctionnalité très utile qui vous permet d'extraire le type de retour d'une fonction particulière.

function foo(e: number): number {
    return e;
}

type fooReturn = ReturnType<typeof foo>; // number

Cependant, j'ai du mal à l'utiliser dans le contexte des fonctions génériques.

function foo<T>(e: T): T {
    return e;
}

type fooReturn = ReturnType<typeof foo>; // type fooReturn = {}

type fooReturn = ReturnType<typeof foo<number>>; // syntax error

type fooReturn = ReturnType<(typeof foo)<number>>; // syntax error

Existe-t-il un moyen d'extraire le type de retour qu'une fonction générique aurait donné des paramètres de type particuliers?

23
samfrances

Le compilateur TypeScript ne voit pas typeof foo comme type générique. Je dirais que c'est un bug dans le compilateur.

Cependant, TypeScript a interfaces appelables qui peuvent être génériques sans aucun problème, donc si vous introduisez une interface appelable compatible avec la signature de votre fonction, vous pouvez implémenter votre propre équivalent de ReturnType comme ce:

function foo<T>(x: T): T {
  return x;
}


interface Callable<R> {
  (...args: any[]): R;
}

type GenericReturnType<R, X> = X extends Callable<R> ? R : never;

type N = GenericReturnType<number, typeof foo>; // number
12
artem