Ответ
В TypeScript часто пишу Utility Types для типизации сложных структур. Например:
type DeepPartial<T> = {
[P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];
};
type Nullable<T> = T | null;
type WithId<T> = T & { id: string };
Реальные кейсы использования:
DeepPartialдля форм редактирования, где нужно делать поля необязательными рекурсивноNullableдля работы с API, где поля могут быть nullWithIdдля унификации типов с обязательным id
Часто комбинирую встроенные Utility Types (Pick, Omit) с кастомными. Важно сохранять читаемость и не усложнять без необходимости.