Parameters

Challenge

Implement the built-in Parameters generic without using it.

For example:

const foo = (arg1: string, arg2: number): void => {};

type FunctionParamsType = MyParameters<typeof foo>; // [arg1: string, arg2: number]

Solution

Diese Aufgabe kann auf zwei Arten gelöst werden:

  1. Man nutzt den eingebauten Utility-Typ ‘Parameters’

  2. Man schreibt den Typ selber, indem man die Parameter inferen lässt.

Wir werden hier die zweite Art / Möglichkeit nutzen. Hierfür definieren wir einen Typen mit einem generischen Parameter und prüfen, ob es sich bei T um eine Funktion mit beliebigen Argumenten und einem beliebigen Rückgabetyp handelt:

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

Nun kann man einfach die Argumentliste der Funktion (...args:any[]) mit einem Infer P versehen, sodass der TypeScript Compiler die Argumente der jeweiligen Funktion P zuweist. Im wahren Zweig (true-branch) der Kondition können wir auf die generische Typ-Variable P zugreifen, und zurückgeben.

type FunctionParamsTyp<T> = T extends (...args: infer A) => any ? A : never;

References

Utility Types Infering with conditional types