Lesson 6 • Advanced
Advanced Types 🧬
Master utility types, conditional types, mapped types, template literals, and type guards — the tools that make TypeScript truly powerful.
What You'll Learn in This Lesson
- • Utility types:
Partial,Pick,Omit,Record,Readonly - • Conditional types with
extendsandinfer - • Mapped types and template literal types
- • Type guards:
typeof,instanceof, custom predicates - • Exhaustiveness checking with
never
1️⃣ Utility Types
TypeScript provides built-in utility types that transform existing types. These eliminate boilerplate and keep your type definitions DRY.
Try It: Utility Types
Partial, Pick, Omit, Record, Readonly, Extract, Exclude
// TypeScript Utility Types — Built-in Type Transformations
console.log("=== Built-in Utility Types ===");
console.log();
// Partial<T> — all properties optional
console.log("Partial<User> — make everything optional");
console.log(" interface User { name: string; age: number; email: string; }");
console.log(" Partial<User> = { name?: string; age?: number; email?: string; }");
console.log(" Great for update functions: updateUser(id, Partial<User>)");
console.log();
// Required<T> — all prope
...2️⃣ Conditional & Mapped Types
Conditional types add if/then/else logic at the type level. The infer keyword captures types from complex structures. Mapped types transform every property in an existing type.
Try It: Conditional Types
Conditional types, infer, mapped types, and template literals
// Conditional & Mapped Types
console.log("=== Conditional Types ===");
console.log("T extends U ? X : Y");
console.log();
console.log("type IsString<T> = T extends string ? true : false;");
console.log("IsString<'hello'> = true");
console.log("IsString<42> = false");
console.log();
console.log("// Real example: unwrap Promise type");
console.log("type Awaited<T> = T extends Promise<infer U> ? U : T;");
console.log("Awaited<Promise<string>> = string");
console.log("Awaited<Promise<number>
...3️⃣ Type Guards & Narrowing
Type guards let you narrow a union type to a specific type within a code block. Use typeof, instanceof, or custom type predicates for safe, narrowed access.
Try It: Type Guards
typeof, instanceof, custom guards, and exhaustiveness checking
// Type Guards and Narrowing Patterns
console.log("=== typeof Guards ===");
function processInput(input) {
if (typeof input === "string") {
console.log(" String: " + input.toUpperCase());
} else if (typeof input === "number") {
console.log(" Number: " + input.toFixed(2));
} else if (typeof input === "boolean") {
console.log(" Boolean: " + (input ? "YES" : "NO"));
}
}
processInput("hello");
processInput(3.14159);
processInput(true);
console.log();
// instanceof guards
cons
...⚠️ Common Mistakes
default: assertNever(x) in switch statements to catch new enum/union members at compile time.Partial<T> for update operations and Required<T> for creation — same interface, different strictness.📋 Quick Reference
| Utility | What It Does |
|---|---|
| Partial<T> | All properties optional |
| Required<T> | All properties required |
| Pick<T, K> | Select specific properties |
| Omit<T, K> | Remove specific properties |
| Record<K, V> | Object type from key/value |
| Readonly<T> | All properties readonly |
| ReturnType<F> | Extract function return type |
🎉 Lesson Complete!
You've conquered advanced types! Next, learn to use TypeScript with React for type-safe components.
Sign up for free to track which lessons you've completed and get learning reminders.