#2759Medium

RequiredByKeys

Implement a generic `RequiredByKeys<T, K>` which takes two type argument `T` and `K`. Master advanced TypeScript type manipulation in this medium-level challenge on TypeScriptPro.

In this medium-level challenge, you'll implement RequiredByKeys<T, K> which makes only the specified keys of T required while leaving the rest unchanged, defaulting to making all properties required when K is not provided.

Challenge Instructions: RequiredByKeys

Medium

Implement a generic RequiredByKeys<T, K> which takes two type argument T and K.

K specify the set of properties of T that should set to be required. When K is not provided, it should make all properties required just like the normal Required<T>.

For example

interface User {
name?: string
age?: number
address?: string
}
 
type UserRequiredName = RequiredByKeys<User, 'name'> // { name: string; age?: number; address?: string }
 

Change the following code to make the test cases pass (no type check errors).

ChallengeSolution
interface User {
  name?: string
  age?: number
  address?: string
}

interface UserRequiredName {
  name: string
  age?: number
  address?: string
}

interface UserRequiredNameAndAge {
  name: string
  age: number
  address?: string
}

type cases = [
  Expect<Equal<RequiredByKeys<User, 'name'>, UserRequiredName>>,
  Expect<Equal<RequiredByKeys<User, 'name' | 'age'>, UserRequiredNameAndAge>>,
  Expect<Equal<RequiredByKeys<User>, Required<User>>>,
  // @ts-expect-error
  Expect<Equal<RequiredByKeys<User, 'name' | 'unknown'>, UserRequiredName>>,
]

Pro Challenge

Unlock 102+ medium, hard, and extreme challenges to master advanced TypeScript.

One-time payment. Lifetime access.

Detailed Explanation

type Merge<T> = { [K in keyof T]: T[K] }
 
type RequiredByKeys<T, K extends keyof T = keyof T> = Merge<
  Omit<T, K> & Required<Pick<T, K>>
>

How it works:

This challenge helps you understand selective property modifier manipulation and intersection type flattening and how to apply these concepts in real-world scenarios.

This challenge is originally from here.

Share this challenge

Learn the Concepts