export type Optional = { [K in keyof T]?: T[K] extends object ? (T[K] extends Function ? T[K] : Optional) : T[K]; }; export type Required = { [K in keyof T]-?: T[K] extends object ? (T[K] extends Function ? T[K] : Required) : T[K]; }; export type Mutable = { -readonly [K in keyof T]: T[K] extends object ? T[K] extends Function ? T[K] : Mutable : T[K]; }; export type Immutable = { readonly [K in keyof T]: T[K] extends object ? T[K] extends Function ? T[K] : Immutable : T[K]; };