Parameters
Challenge
Implement the built-in Parameters
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:
-
Man nutzt den eingebauten Utility-Typ ‘Parameters’
-
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;