DEV Community

Discussion on: Advanced TypeScript Exercises - Question 5

Collapse
 
kashyaprahul94 profile image
Rahul Kashyap

Quick one -


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

type UserReturnType<T extends User, C extends Config> = Required<Omit<T, Exclude<keyof T, keyof KeysOfTrueValues<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

Collapse
 
alextsk profile image
alextsk • Edited

tried to simplify your solution

type OptionalFields<T extends Config> = Pick<T,{
  [K in keyof T]: T[K] extends false ? K : never    
}[keyof T]>

type Result<C extends Config> = Required<Omit<User, keyof OptionalFields<C>>>

declare function getUser<C extends Config>(
     config: C
): Result<C>;
Enter fullscreen mode Exit fullscreen mode

--edit
one more minor improvement

type OptionalFields<T extends Config> = {
  [K in keyof T]: T[K] extends false ? K : never    
}[keyof T]

type Result<C extends Config> = Required<Omit<User, OptionalFields<C>>>

Enter fullscreen mode Exit fullscreen mode
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