type ObjToKeyValUnion = { [K in keyof T]: { key: K; value: T[K] }; }[keyof T]; type ObjToKeyValArray = { [K in keyof T]: [K, T[K]]; }[keyof T]; type ObjToSelectedValueUnion = { [K in keyof T]: T[K]; }[keyof T]; type Optional = Omit & Partial>; type GetOptional = { [P in keyof T as T[P] extends Required[P] ? never : P]: T[P]; };