import type { array } from "./arrays.ts"; import type { Primitive } from "./domain.ts"; import type { Fn } from "./functions.ts"; import type { defined, show } from "./generics.ts"; import type { Key } from "./keys.ts"; import type { intersectUnion } from "./unionToTuple.ts"; export type Dict = { readonly [_ in k]: v; }; export type dict = { [_ in k]: v; }; /** Either: * A, with all properties of B undefined * OR * B, with all properties of A undefined **/ export type propwiseXor = show | show; export type unionToPropwiseXor> = props extends infer distributed ? show : never; export type requireKeys = o & { [requiredKey in key]-?: defined; }; export type require = _require; type _require = depth["length"] extends maxDepth ? o : o extends object ? o extends Fn ? o : { [k in keyof o]-?: _require; } : o; export type PartialRecord = { [_ in k]?: v; }; /** Returns true if a type can be homomorphically mapped without losing information. * Useful for avoiding e.g. classes with private properties while mapping. */ export type isSafelyMappable = { [k in keyof t]: t[k]; } extends t ? true : false; export type KeySet = { readonly [_ in key]?: 1; }; export type keySetOf = KeySet>; export type mutable = _mutable; type _mutable = depth["length"] extends maxDepth ? o : o extends Primitive ? o : o extends Fn ? o : { -readonly [k in keyof o]: _mutable; }; /** * extracts entries mimicking Object.entries, accounting for whether the * object is an array **/ export type entryOf = { [k in keyof o]-?: [k, o[k] & ({} | null)]; }[o extends readonly unknown[] ? keyof o & number : keyof o] & unknown; export type entriesOf = entryOf[]; /** * Object.entries wrapper providing narrowed types for objects with known sets * of keys, e.g. those defined internally as configs */ export declare const entriesOf: (o: o) => entryOf[]; export type Entry = readonly [key: key, value: value]; export type fromEntries = show<{ [entry in entries[number] as entry[0]]: entry[1]; }>; export declare const fromEntries: (entries: entries) => fromEntries; /** Mimics the result of Object.keys(...) */ export type keyOf = o extends array ? number extends o["length"] ? `${number}` : keyof o & `${number}` : keyof o extends infer k ? k extends string ? k : k extends number ? `${k}` : never : never; export declare const keysOf: (o: o) => keyOf[]; export declare const isKeyOf: (k: k, o: o) => k is Extract; /** Coalesce keys that exist on one or more branches of a union */ export type unionKeyOf = t extends unknown ? keyof t : never; export type extractKeyed> = Extract; export declare const hasKey: >(o: o, k: k) => o is extractKeyed; export type extractDefinedKey> = show & { [_ in k]: {} | null; }>; export declare const hasDefinedKey: >(o: o, k: k) => o is extractDefinedKey; export type requiredKeyOf = keyof o extends infer k ? k extends keyof o ? o extends { [_ in k]-?: o[k]; } ? k : never : never : never; export type optionalKeyOf = Exclude>; export type merge = base extends unknown ? props extends unknown ? keyof base & keyof props extends never ? show : show & props> : never : never; export type override = merge; export type propValueOf = o[keyof o]; export declare const InnerDynamicBase: new (base: t) => t; export declare class Covariant { /** * Patterns of the form `interface Example extends T {}` don't count as using `T`. * From tsc's point of view when calculating variance it may as well look like `interface Example {}`. * Fundamentally this ordinarily means `Example` will always be assignable to `Example` and * vice versa. * * Obviously this is a problem, so `Covariant` exists to add an unobtrusive covariant usage of the type * parameter, making `Example` assignable to `Example` only if `T` is a subtype of `U`. */ private " covariant"?; } /** @ts-ignore (needed to extend `t`) **/ export interface DynamicBase extends t, Covariant { } export declare class DynamicBase { constructor(properties: t); } export declare const NoopBase: new () => t; /** @ts-ignore (needed to extend `t`) **/ export declare class CastableBase extends NoopBase { private " covariant"?; } export declare const splitByKeys: >(o: o, leftKeys: leftKeys) => [show>, show>]; /** Homomorphic implementation of the builtin Pick. * * Gives different results for certain union expressions like the following: * * @example * // flattens result to { a?: 1 | 2; b?: 1 | 2 } * type PickResult = Pick<{ a: 1; b?: 1 } | { a?: 2; b: 2 }, "a" | "b"> * * @example * // preserves original type w/ modifier groupings * type pickResult = pick<{ a: 1; b?: 1 } | { a?: 2; b: 2 }, "a" | "b"> */ export type pick = o extends unknown ? { [k in keyof o as k extends key ? k : never]: o[k]; } : never; export declare const pick: >(o: o, keys: keys) => pick; /** Homomorphic implementation of the builtin Omit. * * Gives different results for many union expressions like the following: * * @example * // {} * type OmitResult = Omit<{ a: 1 } | { b: 2 }, never> * * @example * // preserves original type w/ modifier groupings * type omitResult = omit<{ a: 1 } | { b: 2 }, never> */ export type omit = { [k in keyof o as k extends key ? never : k]: o[k]; }; export declare const omit: >(o: o, keys: keys) => omit; /** Returns onTrue if the type is exactly `{}` and onFalse otherwise*/ export type ifEmptyObjectLiteral = [ unknown, t & (null | undefined) ] extends [t | null | undefined, never] ? onTrue : onFalse; export type EmptyObject = Record; export declare const isEmptyObject: (o: object) => o is EmptyObject; export declare const stringAndSymbolicEntriesOf: (o: object) => Entry[]; /** Like Object.assign, but it will preserve getters instead of evaluating them. */ export declare const defineProperties: (base: base, merged: merged) => merge; /** Copies enumerable keys of o to a new object in alphabetical order */ export declare const withAlphabetizedKeys: (o: o) => o; export type invert> = { [k in t[keyof t]]: { [k2 in keyof t]: t[k2] extends k ? k2 : never; }[keyof t]; } & unknown; export declare const invert: >(t: t) => invert; export declare const unset: " unset​"; export type unset = typeof unset; /** * For each keyof o that also exists on jsDocSource, add associated JsDoc annotations to o. * Does not preserve modifiers on o like optionality. */ export type withJsDoc = show : Pick<_withJsDoc, keyof o & keyof jsDocSource> : Pick<_withJsDoc, keyof o & keyof jsDocSource> & { [k in Exclude]: o[k]; }>; type _withJsDoc = { [k in keyof jsDocSource]-?: o[k & keyof o]; }; export type propertyDescriptorsOf = { [k in keyof o]: TypedPropertyDescriptor; }; export type keyWithValue = keyof t extends infer k ? k extends keyof t ? t[k] extends constraint ? k : never : never : never; export declare const enumValues: (tsEnum: tsEnum) => tsEnum[keyof tsEnum][]; export {};