Disclosure

Most of the problems under my TypeHero Challenges folder were either obtained from typehero.dev or from type-challenges repo. Purpose of these articles are just to document my approaches for my easy reference. Please visit the respective links for more info.

Link to original

Problem Description

Implement the built-in Omit<T, K> generic without using it.

Constructs a type by picking all properties from T and then removing K

For example:

interface Todo {
  title: string
  description: string
  completed: boolean
}
 
type TodoPreview = MyOmit<Todo, 'description' | 'title'>
 
const todo: TodoPreview = {
  completed: false,
}

Solutions

Approach: Key Remapping in Mapped Types

type MyOmit<T, KO extends keyof T> = {
	[K in keyof T as K extends KO ? never : K]: T[K];
};

Notes

Simply assigning never as the value won’t remove the property from the mapped type. We need to also have never inside the computed property for that property to not appear. We can do this via remapping using as clause.