DEV Community

Discussion on: Advanced TypeScript Exercises - Question 5

Collapse
 
kashyaprahul94 profile image
Rahul Kashyap • Edited

Slightly verbose one -

type KeysOfTrueValues<T extends Config> = Pick<T, {
    [K in keyof T]: T[K] extends true ? K : never
}[keyof T]>;

type OnlyTrueKeys<T extends User, C extends Config> = Exclude<keyof T, keyof KeysOfTrueValues<C>>;

type FilteredUser<T extends User, C extends Config> = Omit<T, OnlyTrueKeys<T, C>>;

type FilteredUserRequiredFields<T extends User, C extends Config> = Required<FilteredUser<T, C>>;

type UserReturnType<T extends User, C extends Config> = FilteredUserRequiredFields<T, C>;


// Here declaration to be changed 🔥
declare function getUser<T extends User, C extends Config>(
     config: C
): UserReturnType<T, C>;
Enter fullscreen mode Exit fullscreen mode

Playground Link