summaryrefslogtreecommitdiff
path: root/node_modules/type-fest/source/set-optional.d.ts
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/type-fest/source/set-optional.d.ts')
-rw-r--r--node_modules/type-fest/source/set-optional.d.ts34
1 files changed, 34 insertions, 0 deletions
diff --git a/node_modules/type-fest/source/set-optional.d.ts b/node_modules/type-fest/source/set-optional.d.ts
new file mode 100644
index 0000000..3539899
--- /dev/null
+++ b/node_modules/type-fest/source/set-optional.d.ts
@@ -0,0 +1,34 @@
+import {Except} from './except';
+
+/**
+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.
+ Except<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;