import { False , True } from './conditionals' ; /**
 * An object with string keys and values of type `any`.
 */ export type PlainObject = Record < string , any > ; param T returns export type ObjectType < T > = { [ k in keyof T ] : T [ k ] ; } ; param T param U returns export type CombineObjects < T extends object , U extends object > = ObjectType < T & U > ; param T param K returns export type GetKey < T , K extends keyof any > = K extends keyof T ? T [ K ] : never ; param T param K returns export type TryKey < T , K extends keyof any > = K extends keyof T ? T [ K ] : unknown ; param T param U returns export type ElementwiseIntersect < T extends object , U extends object > = { [ k in ( keyof T | keyof U ) ] : TryKey < T , k > & TryKey < U , k > ; } ; /**
 * Objects can be indexed by multiple types: `string`, `number`, `symbol`.
 * For safe compatibility with typescript version, this type will always
 * have the correct set of object key types for the current version of TS.
 *
 * This is useful for functions that must take a key, instead of `K extends string`,
 * use `K extends ObjectKeys`.
 */ export type ObjectKeys = keyof any ; param T returns export type StringKeys < T > = Exclude < keyof T , number | symbol > ; param T returns export type PureKeys < T > = Record < keyof T , keyof T > [ keyof T ] ; param T param U returns export type SharedKeys < T , U > = keyof T & keyof U ; param T param U returns export type AllKeys < T , U > = keyof T | keyof U ; param T param U returns export type DiffKeys < T , U > = Exclude < keyof T , keyof U > ; param T param K returns export type HasKey < T , K extends keyof any > = K extends keyof T ? True : False ; param T returns export type UnionKeys < T > = T extends unknown ? keyof T : never ; param T returns export type UnionizeProperties < T extends object > = T [ keyof T ] ; param T param K returns export type Omit < T extends object , K extends keyof T > = Pick < T , Exclude < keyof T , K > > ; param T param U returns export type Intersect < T extends object , U extends Partial < T > > = Omit < U , DiffKeys < U , T > > ; param T param U returns export type Overwrite < T extends object , U extends object > = { [ k in keyof T ] : k extends keyof U ? U [ k ] : T [ k ] ; } ; param T param U returns export type Merge < T extends object , U extends object > = Overwrite < T , U > & U ; param T param Key returns export type TaggedObject < T extends Record < keyof any , object > , Key extends keyof any > = { [ K in keyof T ] : T [ K ] & Record < Key , K > ; } ; param T returns export type DeepPartial < T > = Partial < { [ k in keyof T ] : T [ k ] extends unknown [ ] ? Array < DeepPartial < T [ k ] [ number ] > > : T [ k ] extends Function ? T [ k ] : T [ k ] extends object ? DeepPartial < T [ k ] > : T [ k ] ; } > ; param T returns export type AllRequired < T extends object > = { [ K in keyof T ] - ? : NonNullable < T [ K ] > ; } ; param T param K returns export type Required < T extends object , K extends keyof T > = CombineObjects < { [ k in K ] - ? : NonNullable < T [ k ] > ; } , Omit < T , K > > ; param T param K returns export type Optional < T extends object , K extends keyof T > = CombineObjects < { [ k in K ] ? : T [ k ] | undefined ; } , Omit < T , K > > ; param T returns export type DeepReadonly < T > = Readonly < { [ k in keyof T ] : T [ k ] extends unknown [ ] ? ReadonlyArray < DeepReadonly < T [ k ] [ number ] > > : T [ k ] extends Function ? T [ k ] : T [ k ] extends object ? DeepReadonly < T [ k ] > : T [ k ] ; } > ; param O param T returns export type KeysByType < O extends object , T > = { [ k in keyof O ] - ? : O [ k ] extends T ? k : never ; } [ keyof O ] ; param T returns export interface ConstructorFor < T extends object > { new ( ... args ) : T ; prototype : T ; } param T returns export type StrictUnion < T > = _StrictUnionHelper < T , T > ; /** no-doc */ export type _StrictUnionHelper < UnionMember , Union > = UnionMember extends unknown ? UnionMember & Partial < Record < Exclude < UnionKeys < Union > , keyof UnionMember > , never > > : never ;