UNPKG

3.28 kBTypeScriptView Raw
1/** Essentials */
2export declare type Primitive = string | number | boolean | undefined | null;
3/** Dictionaries related */
4export declare type Dictionary<T, K extends string | number = string> = {
5 [key in K]: T;
6};
7export declare type DictionaryValues<T> = T extends Dictionary<infer U> ? U : never;
8/** Like Partial but recursive */
9export declare type DeepPartial<T> = {
10 [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends ReadonlyArray<infer U> ? ReadonlyArray<DeepPartial<U>> : DeepPartial<T[P]>;
11};
12/** Like Required but recursive */
13export declare type DeepRequired<T> = T extends Primitive ? NonNullable<T> : T extends any[] ? DeepRequiredArray<NonNullable<T[number]>> : T extends {} ? {
14 [K in keyof T]-?: DeepRequired<NonNullable<T[K]>>;
15} : T;
16interface DeepRequiredArray<T> extends Array<DeepRequired<T>> {
17}
18/** Like Readonly but recursive */
19export declare type DeepReadonly<T> = T extends Primitive ? T : T extends (any[] | ReadonlyArray<any>) ? DeepReadonlyArray<T[number]> : T extends Function ? T : T extends {} ? DeepReadonlyObject<T> : unknown;
20declare type DeepReadonlyObject<T> = {
21 readonly [P in keyof T]: DeepReadonly<T[P]>;
22};
23interface DeepReadonlyArray<T> extends ReadonlyArray<DeepReadonly<T>> {
24}
25/** Make readonly object writable */
26export declare type Writable<T> = {
27 -readonly [P in keyof T]: T[P];
28};
29/** Like Writable but recursive */
30export declare type DeepWritable<T> = T extends Primitive ? T : T extends (any[] | ReadonlyArray<any>) ? WritableArray<T[number]> : T extends Function ? T : DeepWritableObject<T>;
31declare type DeepWritableObject<T> = {
32 -readonly [P in keyof T]: DeepWritable<T[P]>;
33};
34interface WritableArray<T> extends Array<DeepWritable<T>> {
35}
36/** Omit given key in object type */
37export declare type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
38/** Omit all properties of given type in object type */
39export declare type OmitProperties<T, P> = Pick<T, {
40 [K in keyof T]: T[K] extends P ? never : K;
41}[keyof T]>;
42/** Remove keys with `never` value from object type */
43export declare type NonNever<T extends {}> = Pick<T, {
44 [K in keyof T]: T[K] extends never ? never : K;
45}[keyof T]>;
46/** Merge 2 types, properties types from the latter override the ones defined on the former type */
47export declare type Merge<M, N> = Omit<M, Extract<keyof M, keyof N>> & N;
48/** Mark some properties as required, leaving others unchanged */
49export declare type MarkRequired<T, RK extends keyof T> = Exclude<T, RK> & Required<Pick<T, RK>>;
50/** Convert union type to intersection #darkmagic */
51export declare type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I : never;
52/** Easy create opaque types ie. types that are subset of their original types (ex: positive numbers, uppercased string) */
53export declare type Opaque<K, T> = T & {
54 __TYPE__: K;
55};
56/** Easily extract the type of a given object's values */
57export declare type ValueOf<T> = T[keyof T];
58/** Type constraint for tuple inference */
59export declare type Tuple<T = any> = [T] | T[];
60/** Useful as a return type in interfaces or abstract classes with missing implementation */
61export declare type AsyncOrSync<T> = PromiseLike<T> | T;
62export {};
63
\No newline at end of file