Crash Courses · Masters
Utility Types
Use TypeScript built-in utility types to transform and compose existing types.
10 min read+175 XP on completionCert: TypeScript Crash Course
Tap any word in the text below to start reading from there.
Utility Types
TypeScript ships with utility types that transform existing types — no need to rewrite manually.
Partial and Required
interface User { id: string; name: string; email: string; bio: string }
type UserUpdate = Partial<User>
// { id?: string; name?: string; email?: string; bio?: string }
async function updateUser(id: string, data: Partial<User>): Promise<User> {
return fetch(`/api/users/${id}`, {
method: 'PATCH',
body: JSON.stringify(data),
}).then(r => r.json())
}Pick and Omit
interface User {
id: string; name: string; email: string
passwordHash: string; bio: string
}
// Only these fields
type PublicUser = Pick<User, 'id' | 'name' | 'bio'>
// Everything except passwordHash
type SafeUser = Omit<User, 'passwordHash'>Record
type TrackColors = Record<'tech' | 'marketing' | 'trading', string>
const colors: TrackColors = {
tech: '#378add', marketing: '#c9a84c', trading: '#2d8a4e',
}
// Dynamic lookup map
type CourseLookup = Record<string, Course>
const byId: CourseLookup = {}
courses.forEach(c => { byId[c.id] = c })ReturnType and Parameters
function createUser(name: string, email: string) {
return { id: crypto.randomUUID(), name, email, createdAt: new Date() }
}
type NewUser = ReturnType<typeof createUser>
// { id: string; name: string; email: string; createdAt: Date }Combining Utility Types
type CourseForm = Partial<Omit<Course, 'id' | 'createdAt'>>
type ImmutableConfig = Readonly<Record<string, string>>Reading progress
0% read
In this module
Partial<T>
Required<T>
Readonly<T>
Pick<T, K>
0%