type PickRequiredProperties<T> = Pick<T, { [K in keyof T]: {} extends Pick<T, K> ? never : K }[keyof T]>; type Foo = { a?: number; b: number; c: number; }; type Bar = PickRequiredProperties<Foo>;