Version: 0.1.00.2.00.3.00.3.10.4.00.4.10.5.00.5.10.5.20.6.00.7.00.7.10.8.00.8.10.9.00.10.00.11.00.12.00.13.00.13.10.14.00.15.00.15.10.16.00.17.00.18.00.18.10.19.00.20.00.20.10.20.20.21.00.21.10.21.20.21.31.0.01.0.11.0.21.1.01.1.11.1.21.1.31.2.01.2.11.2.21.2.31.3.01.4.02.0.02.1.02.2.02.3.02.3.12.3.22.3.32.3.42.4.02.5.02.5.12.5.22.5.32.5.42.6.02.7.02.8.02.9.02.10.02.11.02.11.12.11.22.12.02.12.12.12.22.13.02.13.12.14.02.15.02.15.12.16.02.17.02.18.02.18.12.19.03.0.03.1.03.2.03.3.03.4.03.5.03.5.13.5.23.5.33.5.43.5.53.5.63.5.73.6.03.6.13.7.03.7.13.7.23.8.03.9.03.10.03.11.03.11.13.12.03.13.03.13.14.0.04.1.04.2.04.3.04.3.14.3.24.3.34.4.04.5.04.6.04.7.04.7.14.8.04.8.14.8.24.8.34.9.04.10.04.10.14.10.24.10.34.11.04.11.14.12.04.13.04.13.14.14.04.15.04.16.04.17.04.18.04.18.14.18.24.18.34.19.04.20.04.20.14.21.04.22.04.22.14.23.04.24.04.25.04.26.04.26.1
import type {Except} from './except';
import type {Simplify} from './simplify';
/**
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 type {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.
// }
@category Object
*/
export type SetOptional<BaseType, Keys extends keyof BaseType> =
Simplify<
// Pick just the keys that are readonly from the base type.
Except<BaseType, Keys> &
// Pick the keys that should be mutable from the base type and make them mutable.
Partial<Pick<BaseType, Keys>>
>;