/** * The `Merge` and `TupleToUnion` types (and their dependant types) from the `type-fest` package. * https://github.com/sindresorhus/type-fest */ export type TupleToUnion = ArrayType extends readonly unknown[] ? ArrayType[number] : never; type PickIndexSignature = { [KeyType in keyof ObjectType as object extends Record ? KeyType : never]: ObjectType[KeyType]; }; type OmitIndexSignature = { [KeyType in keyof ObjectType as object extends Record ? never : KeyType]: ObjectType[KeyType]; }; type Simplify = { [KeyType in keyof T]: T[KeyType]; }; type RequiredFilter = undefined extends Type[Key] ? Type[Key] extends undefined ? Key : never : Key; type OptionalFilter = undefined extends Type[Key] ? Type[Key] extends undefined ? never : Key : never; type EnforceOptional = Simplify<{ [Key in keyof ObjectType as RequiredFilter]: ObjectType[Key]; } & { [Key in keyof ObjectType as OptionalFilter]?: Exclude; }>; type SimpleMerge = { [Key in keyof Destination | keyof Source]: Key extends keyof Source ? Source[Key] : Key extends keyof Destination ? Destination[Key] : never; }; export type Merge = EnforceOptional, PickIndexSignature> & SimpleMerge, OmitIndexSignature>>; export {};