"Pick when you know what to keep. Omit when you know what to drop."
Pick<T, K> — select specific keys
Pick<User, 'id' | 'email'> creates a new type with only those two fields. The second parameter K is constrained to be keyof T, so you can't ask for keys that don't exist. The resulting type has only the picked fields, with their original types.
Useful when you want to expose a subset of an interface — e.g., a public profile that's a subset of the full User shape.
Omit<T, K> — remove specific keys
Omit<User, 'password'> creates a new type without that field. The remaining fields keep their types. Useful when you want everything except a sensitive subset — strip password before returning to a client, strip internal_id before sending to an API.
When to choose which
Both are valid for the same operation; pick whichever has the shorter list. If you want 3 fields out of 20, Pick is more obvious. If you want 17 out of 20, Omit reads better.
Also: Pick fails loudly if you typo a key (the constraint catches it). Omit only fails loudly in strict mode — without it, omitting a non-existent key is silently allowed.