Get Return Type

Challenge

Implement the built-in ReturnType<T> generic without using it.

For example

const fn = (v: boolean) => {
  if (v) return 1;
  else return 2;
};

type a = MyReturnType<typeof fn>; // should be "1 | 2"

Solution

Zur Lösung des Problems müssen wir wieder das Schluesselwort infer nutzen. Zusätzlich definieren wir eine Bedindung für den Eingabewert, sodass der Typ nur Funktionen erhalten kann. Den Rückgabetyp erhalten wir, indem wir diesen inferieren und einer Typ Variable zuweisen:

type MyReturnType<T extends (...args: any[]) => any> = T extends (
  ...args: any[]
) => infer Return
  ? Return
  : never;

References

Infering with conditional types