A mapped type can make every property optional for update objects.

Partial Update Shape

partial_update.ts
type Task = {
    title: string;
    done: boolean;
    points: number;
};

type Update<T> = {
    [K in keyof T]?: T[K];
};

function applyUpdate(task: Task, update: Update<Task>): string {
    const next: Task = { ...task, ...update };
    return `${next.title}:${next.done}:${next.points}`;
}

const doneValue: boolean = ;
const original: Task = { title: "Trace", done: false, points: 3 };
const update: Update<Task> = { done: doneValue, points: 5 };

console.log(applyUpdate(original, update));
type Task = {
    title: string;
    done: boolean;
    points: number;
};

type Update<T> = {
    [K in keyof T]?: T[K];
};

function applyUpdate(task: Task, update: Update<Task>): string {
    const next: Task = { ...task, ...update };
    return `${next.title}:${next.done}:${next.points}`;
}

const doneValue: boolean = ;
const original: Task = { title: "Trace", done: false, points: 3 };
const update: Update<Task> = { done: doneValue, points: 5 };

console.log(applyUpdate(original, update));
optional mapped property Adding `?` inside a mapped type creates a version where each key may be omitted.