/** 
 | 
Create a type that makes the given keys optional. The remaining keys are kept as is. The sister of the `SetRequired` type. 
 | 
  
 | 
Use-case: You want to define a single model where the only thing that changes is whether or not some of the keys are optional. 
 | 
  
 | 
@example 
 | 
``` 
 | 
import {SetOptional} from 'type-fest'; 
 | 
  
 | 
type Foo = { 
 | 
    a: number; 
 | 
    b?: string; 
 | 
    c: boolean; 
 | 
} 
 | 
  
 | 
type SomeOptional = SetOptional<Foo, 'b' | 'c'>; 
 | 
// type SomeOptional = { 
 | 
//     a: number; 
 | 
//     b?: string; // Was already optional and still is. 
 | 
//     c?: boolean; // Is now optional. 
 | 
// } 
 | 
``` 
 | 
*/ 
 | 
export type SetOptional<BaseType, Keys extends keyof BaseType = keyof BaseType> = 
 | 
    // Pick just the keys that are not optional from the base type. 
 | 
    Pick<BaseType, Exclude<keyof BaseType, Keys>> & 
 | 
    // Pick the keys that should be optional from the base type and make them optional. 
 | 
    Partial<Pick<BaseType, Keys>> extends 
 | 
    // If `InferredType` extends the previous, then for each key, use the inferred type key. 
 | 
    infer InferredType 
 | 
        ? {[KeyType in keyof InferredType]: InferredType[KeyType]} 
 | 
        : never; 
 |