/** Combines members of an intersection into a readable type. */ export type Compute = { [key in keyof type]: type[key]; } & unknown; declare const symbol: unique symbol; /** * Creates a branded type of `T` with the brand `U`. * * @example * ```ts * type Result = Branded * // ^? type Result = string & { [symbol]: 'foo' } * ``` */ export type Branded = T & { [symbol]: U; }; /** * Filters out all members of `T` that are not `P` * * @example * ```ts * type Result = Filter<['a', 'b', 'c'], 'b'> * // ^? type Result = ['a', 'c'] * ``` * * @internal */ export type Filter = T extends readonly [infer F, ...infer Rest extends readonly unknown[]] ? [F] extends [P] ? Filter : Filter : readonly [...Acc]; /** * Checks if `T` can be narrowed further than `U` * * @example * ```ts * type Result = IsNarrowable<'foo', string> * // ^? true * ``` */ export type IsNarrowable = IsNever<(T extends U ? true : false) & (U extends T ? false : true)> extends true ? false : true; /** * Checks if `T` is `never` * * @example * ```ts * type Result = IsNever * // ^? type Result = true * ``` */ export type IsNever = [T] extends [never] ? true : false; /** * Removes `readonly` from all properties of an object. * * @internal */ export type Mutable = { -readonly [key in keyof type]: type[key]; }; /** * Evaluates boolean "or" condition for `T` properties. * * * @example * ```ts * type Result = Or<[false, true, false]> * // ^? type Result = true * ``` * * @example * ```ts * type Result = Or<[false, false, false]> * // ^? type Result = false * ``` * * @internal */ export type Or = T extends readonly [infer Head, ...infer Tail] ? Head extends true ? true : Or : false; /** * Checks if `T` is `undefined` * * @example * ```ts * type Result = IsUndefined * // ^? type Result = true * ``` * * @internal */ export type IsUndefined = [undefined] extends [T] ? true : false; /** * Checks if type `T` is the `unknown` type. * * @internal */ export type IsUnknown = unknown extends T ? ([T] extends [null] ? false : true) : false; /** @internal */ export type MaybePromise = T | Promise; /** * Makes attributes on the type T required if required is true. * * @example * ```ts * MaybeRequired<{ a: string, b?: number }, true> * // { a: string, b: number } * * MaybeRequired<{ a: string, b?: number }, false> * // { a: string, b?: number } * ``` * * @internal */ export type MaybeRequired = required extends true ? ExactRequired : T; /** * Assigns the properties of U onto T. * * @example * ```ts * Assign<{ a: string, b: number }, { a: undefined, c: boolean }> * // { a: undefined, b: number, c: boolean } * ``` * * @internal */ export type Assign = Assign_inner & U; /** @internal */ export type Assign_inner = { [K in keyof T as K extends keyof U ? (U[K] extends void ? never : K) : K]: K extends keyof U ? U[K] : T[K]; }; /** * Constructs a type by excluding `undefined` from `T`. * * @example * ```ts * NoUndefined * // string * ``` * * @internal */ export type NoUndefined = T extends undefined ? never : T; /** * Strict version of built-in Omit type * * @internal */ export type Omit = Pick>; /** * Creates a type that is a partial of T, but with the required keys K. * * @example * ```ts * PartialBy<{ a: string, b: number }, 'a'> * // { a?: string, b: number } * ``` * * @internal */ export type PartialBy = Omit & ExactPartial>; export type RecursiveArray = T | readonly RecursiveArray[]; /** * Creates a type that is T with the required keys K. * * @example * ```ts * RequiredBy<{ a?: string, b: number }, 'a'> * // { a: string, b: number } * ``` * * @internal */ export type RequiredBy = Omit & ExactRequired>; /** * Returns truthy if `array` contains `value`. * * @example * ```ts * Some<[1, 2, 3], 2> * // true * ``` * * @internal */ export type Some = array extends readonly [ value, ...unknown[] ] ? true : array extends readonly [unknown, ...infer rest] ? Some : false; /** * Prints custom error message * * @param messages - Error message * @returns Custom error message * * @example * ```ts * type Result = TypeErrorMessage<'Custom error message'> * // ^? type Result = ['Error: Custom error message'] * ``` */ export type TypeErrorMessage = messages extends string ? [ `Error: ${messages}` ] : { [key in keyof messages]: messages[key] extends infer message extends string ? `Error: ${message}` : never; }; /** @internal */ export type UnionToTuple> = [union] extends [never] ? [] : [...UnionToTuple>, last]; /** @internal */ export type LastInUnion = UnionToIntersection 0 : never> extends (x: infer l) => 0 ? l : never; /** @internal */ export type UnionToIntersection = (union extends unknown ? (arg: union) => 0 : never) extends (arg: infer i) => 0 ? i : never; /** @internal */ export type IsUnion = union extends union2 ? ([union2] extends [union] ? false : true) : never; /** @internal */ export type MaybePartial = enabled extends true ? Compute> : type; export type ExactPartial = { [key in keyof type]?: type[key] | undefined; }; /** @internal */ export type ExactRequired = { [key in keyof type]-?: Exclude; }; export type OneOf = KeyofUnion> = union extends infer item ? Compute]?: fallback extends object ? key extends keyof fallback ? fallback[key] : undefined : undefined; }> : never; /** @internal */ export type KeyofUnion = type extends type ? keyof type : never; /** @internal */ export type Undefined = { [key in keyof type]?: undefined; }; /** * Loose version of {@link Omit} * @internal */ export type LooseOmit = Pick>; /** @internal */ export type UnionCompute = type extends object ? Compute : type; /** @internal */ export type UnionLooseOmit = type extends any ? LooseOmit : never; /** * Construct a type with the properties of union type T except for those in type K. * @example * ```ts * type Result = UnionOmit<{ a: string, b: number } | { a: string, b: undefined, c: number }, 'a'> * // { b: number } | { b: undefined, c: number } * ``` * * @internal */ export type UnionOmit = type extends any ? Omit : never; /** * Construct a type with the properties of union type T except for those in type K. * @example * ```ts * type Result = UnionOmit<{ a: string, b: number } | { a: string, b: undefined, c: number }, 'a'> * // { b: number } | { b: undefined, c: number } * ``` * * @internal */ export type UnionPick = type extends any ? Pick : never; /** * Creates a type that is a partial of T, but with the required keys K. * * @example * ```ts * PartialBy<{ a: string, b: number } | { a: string, b: undefined, c: number }, 'a'> * // { a?: string, b: number } | { a?: string, b: undefined, c: number } * ``` * * @internal */ export type UnionPartialBy = T extends any ? PartialBy : never; /** * Creates a type that is T with the required keys K. * * @example * ```ts * RequiredBy<{ a?: string, b: number } | { a?: string, c?: number }, 'a'> * // { a: string, b: number } | { a: string, c?: number } * ``` * * @internal */ export type UnionRequiredBy = T extends any ? RequiredBy : never; export {}; //# sourceMappingURL=types.d.ts.map