/** * Тип, который возвращает дифф между двумя объектами */ export type Diff = T extends U ? never : T; /** * Получить размер кортежа */ export type GetLength = T['length']; /** * Получить кортеж БЕЗ первого элемента */ export type DropFirstInTuple = ((...args: T) => any) extends (arg: any, ...rest: infer U) => any ? U : T; /** * Тип, позволяющий получить последний кортежа */ export type GetLast = T[GetLength>]; /** * Тип который может deep изменять свойства number -> number | string */ export type StringifyObject = { [Key in keyof Base]: Base[Key] extends number ? number | string : Base[Key] extends Record ? StringifyObject : Base[Key]; }; /** * Как Partial, но уходящий вглубь. */ // eslint-disable-next-line @typescript-eslint/ban-types export type DeepPartial = T extends object ? { [P in keyof T]?: DeepPartial; } : T;