Two Useful Utility Types in Typescript: “Partial” and “Pick”

Sumit kumar Singh
Frontend Weekly
Published in
4 min readDec 11, 2023

--

TypeScript, a superset of JavaScript, introduces powerful static typing to the language. One of its key features is the ability to create and manipulate types, allowing developers to express more accurate and robust interfaces for their code. Two essential utility types in TypeScript that facilitate this are Partial and Pick. In this exploration, we'll delve into each of these types, understanding their use cases, syntax, and practical applications.

Understanding the Basics

1. Partial: A Fractional Approach to Types

The Partial utility type is aptly named, as it enables the creation of partially complete versions of existing types. It takes an existing type and makes all its properties optional. This means that any property in the original type can either be present in the partial version or omitted entirely.

Syntax:

type Partial<T> = {
[P in keyof T]?: T[P];
};

Here, T represents the original type, and Partial<T> produces a new type with all properties of T made optional.

Example:

interface Person {
name: string;
age: number;
address: string;
}

type PartialPerson = Partial<Person>;

// PartialPerson allows missing properties
const partialInfo: PartialPerson = {
name: 'John',
};

In this example, PartialPerson allows for incomplete information about a person, making properties like age and address optional.

2. Pick: A Selective Extraction

On the other hand, the Pick utility type is all about precision. It allows developers to extract a subset of properties from an existing type to create a new one.

Syntax:

type Pick<T, K extends keyof T> = {
[P in K]: T[P];
};

Here, T is the original type, and K is a union of keys from T that you want to pick.

Example:

interface Car {
make: string;
model: string;
year: number;
color: string;
}

type CarInfo = Pick<Car, 'make' | 'model'>;

// CarInfo only includes 'make' and 'model'
const carDetails: CarInfo = {
make: 'Toyota',
model: 'Camry',
};

In this case, CarInfo selectively includes only the make and model properties from the original Car type.

Practical Applications

1. Partial: Flexible Data Entry

The Partial type is particularly useful when dealing with forms or situations where not all fields need to be filled out. Consider a scenario where you're collecting information about a user, and some details are optional:

interface User {
name: string;
email: string;
phone?: string;
address?: string;
}

type PartialUser = Partial<User>;

function updateUserDetails(user: User, details: PartialUser): User {
return { ...user, ...details };
}

const initialUser: User = {
name: 'Alice',
email: 'alice@example.com',
};

const updatedUser = updateUserDetails(initialUser, {
phone: '123-456-7890',
});

console.log(updatedUser);

Here, PartialUser allows us to update only the specified details without requiring all properties to be present. This flexibility is valuable in scenarios where certain information is optional.

2. Pick: Enhanced Type Safety

The Pick type enhances type safety by explicitly defining the properties you're working with. This is beneficial when you want to ensure that only a subset of properties is being used in a specific context.

interface Order {
orderId: string;
product: string;
quantity: number;
customer: string;
shippingAddress: string;
}

type OrderSummary = Pick<Order, 'orderId' | 'product' | 'quantity'>;

function generateOrderSummary(order: OrderSummary): string {
// Only 'orderId', 'product', and 'quantity' are accessible
return `Order #${order.orderId}: ${order.quantity} x ${order.product}`;
}

const sampleOrder: Order = {
orderId: '123',
product: 'Laptop',
quantity: 2,
customer: 'John Doe',
shippingAddress: '123 Main St',
};

const summary = generateOrderSummary({
orderId: sampleOrder.orderId,
product: sampleOrder.product,
quantity: sampleOrder.quantity,
});

console.log(summary);

By using Pick to create the OrderSummary type, we ensure that the generateOrderSummary function only accepts the specified properties, reducing the risk of accidental misuse.

Conclusion

In TypeScript, the Partial and Pick utility types provide developers with powerful tools for creating flexible and precise type definitions. Partial allows for the creation of types with optional properties, promoting adaptability in scenarios where not all fields are required. On the other hand, Pick enhances type safety by allowing developers to explicitly select and use a subset of properties from an existing type.

Understanding and mastering these utility types can significantly improve code readability, maintainability, and reduce the likelihood of bugs by leveraging TypeScript’s static type checking capabilities. As you continue to explore TypeScript, these utility types will prove invaluable in expressing intent and enforcing constraints in your code.

Thanks for reading!

I hope, you found this article useful. If you have any questions or suggestions, please leave comments. Your feedback helps me to become better.

Don’t forget to subscribe⭐️

Facebook Page: https://www.facebook.com/designTechWorld1

Instagram Page: https://www.instagram.com/techd.esign/

Youtube Channel: https://www.youtube.com/@tech..Design/

Twitter: https://twitter.com/sumit_singh2311

TopMate: Sumit Kumar Singh (topmate.io)

--

--

Sumit kumar Singh
Frontend Weekly

YouTube: https://www.youtube.com/@tech..Design/ 📚 HTML,Angular, React,and JavaScript 🧑‍💻 Tips & tricks on Web Developing 👉 FULL STACK DEVELOPER