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?
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