ts-gems 0.0.3 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/common.d.ts CHANGED
@@ -1,19 +1,83 @@
1
- export type Primitive = string | number | boolean | null | bigint | symbol | undefined;
2
- export type Builtin = Primitive | Function | Date | Error | RegExp;
3
- export type NonObj = Primitive | Function;
4
- export type NonSymbol = Exclude<Builtin, symbol>;
1
+ /**
2
+ * BasicPrimitive
3
+ * @desc Type representing [`BasicPrimitive`](https://www.typescriptlang.org/docs/handbook/release-notes/overview.html#smarter-type-alias-preservation) types in TypeScript
4
+ */
5
+ type BasicPrimitive = number | string | boolean;
5
6
 
7
+
8
+ /**
9
+ * Primitive
10
+ * @desc Type representing [`Primitive`](https://developer.mozilla.org/en-US/docs/Glossary/Primitive) types
11
+ * in TypeScript: `string | number | bigint | boolean | symbol | null | undefined`
12
+ */
13
+ export type Primitive = BasicPrimitive | null | bigint | symbol | undefined;
14
+
15
+ /**
16
+ * JsonTypes
17
+ * @desc Type representing JSON types in TypeScript
18
+ */
19
+ type JsonType = BasicPrimitive | null | object | (BasicPrimitive | object)[]
20
+
21
+
22
+ /**
23
+ * Builtin
24
+ * @desc Type representing Builtin types in JavaScript
25
+ */
26
+ export type Builtin = Primitive | Function | String | Number | Date | Error | RegExp |
27
+ ArrayBuffer | DataView | Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array |
28
+ Int32Array | Uint32Array | Float32Array | Float64Array;
29
+
30
+ /**
31
+ * Maybe
32
+ * @desc Type representing T | undefined
33
+ */
6
34
  export type Maybe<T> = T | undefined;
7
- export type Nullable<T> = T | undefined | null;
8
35
 
36
+ /**
37
+ * Nullish
38
+ * @desc Type representing [nullish values][https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-7.html#nullish-coalescing] in TypeScript: `null | undefined`
39
+ */
40
+ export type Nullish<T = null> = T | undefined | null;
41
+
42
+ /**
43
+ * Falsy
44
+ * @desc Type representing falsy values in TypeScript: `false | "" | 0 | null | undefined`
45
+ */
46
+ export type Falsy = false | '' | 0 | null | undefined;
47
+
48
+
49
+ export type Awaited<T> = T extends PromiseLike<infer U> ? U : T;
50
+
51
+
52
+ export type Thunk<T, Args extends any[] = any[]> = T | ((...args: Args) => T);
53
+ export type AsyncThunk<T, Args extends any[] = any[]> = Thunk<T> | ((...args: Args) => Promise<T>);
54
+
55
+
56
+ /**
57
+ * PropertyType
58
+ * @desc Returns the type of property at a given key `K`
59
+ */
60
+ export type PropertyType<T, K extends keyof T> = T[K];
61
+
62
+ /**
63
+ * $ElementType
64
+ * @desc Returns the type of elements inside of array, tuple or object of type `T`, that matches the given index type `K`
65
+ */
66
+ export type ElementType<T extends { [P in K & any]: any },
67
+ K extends keyof T | number> = T[K];
68
+
69
+
70
+ /**
71
+ * Class
72
+ * @desc Represents constructor of type T
73
+ */
9
74
  export interface Type<T = any> {
10
75
  new(...args: any[]): T;
11
76
  }
12
77
 
13
- export type Awaited<T> = T extends PromiseLike<infer PT> ? PT : T;
14
-
78
+ /**
79
+ * Class
80
+ * @desc Represents Class constructor of type T
81
+ */
15
82
  export type Class<Args extends any[] = any[], Instance = {}, Static = {}> =
16
83
  (new(...args: Args) => Instance) & Static;
17
-
18
- export type Thunk<T, Args extends any[] = any[]> = T | ((...args: Args) => T);
19
- export type AsyncThunk<T, Args extends any[] = any[]> = T | ((...args: Args) => T) | ((...args: Args) => Promise<T>);
@@ -0,0 +1,106 @@
1
+ import {Builtin} from './common';
2
+ import {IfTuple} from './type-check';
3
+ import {OptionalKeys} from './keys';
4
+
5
+ /**
6
+ * Partial but deeply
7
+ */
8
+ export type DeepPartial<T> = _DeepPartial<T>;
9
+ type _DeepPartial<T> =
10
+ T extends Builtin ? T
11
+ : T extends Promise<infer U> ? Promise<DeepPartial<U>>
12
+ : T extends Map<infer K, infer V> ? Map<K, DeepPartial<V>>
13
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPartial<V>>
14
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPartial<V>>
15
+ : T extends Set<infer U> ? Set<DeepPartial<U>>
16
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPartial<U>>
17
+ : T extends WeakSet<infer U> ? WeakSet<DeepPartial<U>>
18
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPartial<T[K]> }
19
+ : T extends (infer U)[] ? DeepPartial<U>[]
20
+ : { [P in keyof T]?: DeepPartial<Exclude<T[P], undefined>> };
21
+
22
+ /**
23
+ * Combination of Partial and Writable but deeply
24
+ */
25
+ export type DeepBuildable<T> = _DeepBuildable<T>;
26
+ type _DeepBuildable<T> =
27
+ T extends Builtin ? T
28
+ : T extends Promise<infer U> ? Promise<DeepBuildable<U>>
29
+ : T extends Map<infer K, infer V> ? Map<K, DeepBuildable<V>>
30
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepBuildable<V>>
31
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepBuildable<V>>
32
+ : T extends Set<infer U> ? Set<DeepBuildable<U>>
33
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepBuildable<U>>
34
+ : T extends WeakSet<infer U> ? WeakSet<DeepBuildable<U>>
35
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepBuildable<T[K]> }
36
+ : T extends (infer U)[] ? DeepBuildable<U>[]
37
+ : { -readonly [P in keyof T]?: DeepBuildable<Exclude<T[P], undefined>> };
38
+
39
+ /**
40
+ * Make all properties in T required deeply
41
+ */
42
+ export type DeepRequired<T> = _DeepRequired<T>;
43
+ type _DeepRequired<T> =
44
+ T extends Builtin ? T
45
+ : T extends Promise<infer U> ? Promise<DeepRequired<U>>
46
+ : T extends Map<infer K, infer V> ? Map<K, DeepRequired<V>>
47
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepRequired<V>>
48
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepRequired<V>>
49
+ : T extends Set<infer U> ? Set<DeepRequired<U>>
50
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepRequired<U>>
51
+ : T extends WeakSet<infer U> ? WeakSet<DeepRequired<U>>
52
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepRequired<T[K]> }
53
+ : T extends (infer U)[] ? DeepRequired<U>[]
54
+ : { [P in keyof T]-?: DeepRequired<Exclude<T[P], undefined>> };
55
+
56
+
57
+ /**
58
+ * Make all properties in T readonly deeply
59
+ */
60
+ export type DeepReadonly<T> = _DeepReadonly<T>;
61
+ type _DeepReadonly<T> =
62
+ T extends Builtin ? T
63
+ : T extends Promise<infer U> ? Promise<DeepReadonly<U>>
64
+ : T extends Map<infer K, infer V> ? Map<K, DeepReadonly<V>>
65
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepReadonly<V>>
66
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepReadonly<V>>
67
+ : T extends Set<infer U> ? Set<DeepReadonly<U>>
68
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepReadonly<U>>
69
+ : T extends WeakSet<infer U> ? WeakSet<DeepReadonly<U>>
70
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepReadonly<T[K]> }
71
+ : T extends (infer U)[] ? DeepReadonly<U>[]
72
+ : { readonly [P in keyof T]: DeepReadonly<Exclude<T[P], undefined>> };
73
+
74
+ /**
75
+ * Make all properties in T writable deeply
76
+ */
77
+ export type DeepWritable<T> = _DeepWritable<T>;
78
+ type _DeepWritable<T> =
79
+ T extends Builtin ? T
80
+ : T extends Promise<infer U> ? Promise<DeepWritable<U>>
81
+ : T extends Map<infer K, infer V> ? Map<K, DeepWritable<V>>
82
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepWritable<V>>
83
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepWritable<V>>
84
+ : T extends Set<infer U> ? Set<DeepWritable<U>>
85
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepWritable<U>>
86
+ : T extends WeakSet<infer U> ? WeakSet<DeepWritable<U>>
87
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepWritable<T[K]> }
88
+ : T extends (infer U)[] ? DeepWritable<U>[]
89
+ : { -readonly [P in keyof T]: DeepWritable<Exclude<T[P], undefined>> };
90
+
91
+ /**
92
+ * Make all properties in T nullable deeply
93
+ */
94
+ export type DeepNullish<T> = _DeepNullish<DeepRequired<T>>;
95
+ type _DeepNullish<T> =
96
+ T extends Builtin ? T | null | undefined
97
+ : T extends Promise<infer U> ? Promise<DeepNullish<U>>
98
+ : T extends Map<infer K, infer V> ? Map<K, DeepNullish<V>>
99
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepNullish<V>>
100
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepNullish<V>>
101
+ : T extends Set<infer U> ? Set<DeepNullish<U>>
102
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepNullish<U>>
103
+ : T extends WeakSet<infer U> ? WeakSet<DeepNullish<U>>
104
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepNullish<T[K]> }
105
+ : T extends (infer U)[] ? DeepNullish<U>[] | null | undefined
106
+ : { [P in keyof T]: DeepNullish<T[P]>| null | undefined };
@@ -0,0 +1,88 @@
1
+ import {Builtin} from './common';
2
+ import {IfTuple} from './type-check';
3
+ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
4
+
5
+ /**
6
+ * Omit all optional properties in T deeply
7
+ */
8
+ export type DeepOmitOptional<T> = _DeepOmitOptional<T>;
9
+ type _DeepOmitOptional<T, K extends keyof T = Exclude<keyof T, OptionalKeys<T>>> =
10
+ T extends Builtin ? T
11
+ : T extends Promise<infer U> ? Promise<DeepOmitOptional<U>>
12
+ : T extends Map<infer K, infer V> ? Map<K, DeepOmitOptional<V>>
13
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitOptional<V>>
14
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitOptional<V>>
15
+ : T extends Set<infer U> ? Set<DeepOmitOptional<U>>
16
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitOptional<U>>
17
+ : T extends WeakSet<infer U> ? WeakSet<DeepOmitOptional<U>>
18
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitOptional<T[K]> }
19
+ : T extends (infer U)[] ? DeepOmitOptional<U>[]
20
+ : { [P in K]: DeepOmitOptional<Exclude<T[P], undefined>> };
21
+
22
+ /**
23
+ * Omit all required properties in T deeply
24
+ */
25
+ export type DeepOmitRequired<T> = _DeepOmitRequired<T>;
26
+ type _DeepOmitRequired<T, J extends keyof T = Exclude<keyof T, RequiredKeys<T>>> =
27
+ T extends Builtin ? T
28
+ : T extends Promise<infer U> ? Promise<DeepOmitRequired<U>>
29
+ : T extends Map<infer K, infer V> ? Map<K, DeepOmitRequired<V>>
30
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitRequired<V>>
31
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitRequired<V>>
32
+ : T extends Set<infer U> ? Set<DeepOmitRequired<U>>
33
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitRequired<U>>
34
+ : T extends WeakSet<infer U> ? WeakSet<DeepOmitRequired<U>>
35
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitRequired<T[K]> }
36
+ : T extends (infer U)[] ? DeepOmitRequired<U>[]
37
+ : { [P in J]: DeepOmitRequired<Exclude<T[P], undefined>> };
38
+
39
+ /**
40
+ * Omit all readonly properties in T deeply
41
+ */
42
+ export type DeepOmitReadonly<T> = _DeepOmitReadonly<T>;
43
+ type _DeepOmitReadonly<T, J extends keyof T = Exclude<keyof T, ReadonlyKeys<T>>> =
44
+ T extends Builtin ? T
45
+ : T extends Promise<infer U> ? Promise<DeepOmitReadonly<U>>
46
+ : T extends Map<infer K, infer V> ? Map<K, DeepOmitReadonly<V>>
47
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitReadonly<V>>
48
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitReadonly<V>>
49
+ : T extends Set<infer U> ? Set<DeepOmitReadonly<U>>
50
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitReadonly<U>>
51
+ : T extends WeakSet<infer U> ? WeakSet<DeepOmitReadonly<U>>
52
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitReadonly<T[K]> }
53
+ : T extends (infer U)[] ? DeepOmitReadonly<U>[]
54
+ : { [P in J]: DeepOmitReadonly<Exclude<T[P], undefined>> };
55
+
56
+ /**
57
+ * Omit all writable properties in T deeply
58
+ */
59
+ export type DeepOmitWritable<T> = _DeepOmitWritable<T>
60
+ type _DeepOmitWritable<T, K extends keyof T = Exclude<keyof T, WritableKeys<T>>> =
61
+ T extends Builtin ? T
62
+ : T extends Promise<infer U> ? Promise<DeepOmitWritable<U>>
63
+ : T extends Map<infer K, infer V> ? Map<K, DeepOmitWritable<V>>
64
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitWritable<V>>
65
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitWritable<V>>
66
+ : T extends Set<infer U> ? Set<DeepOmitWritable<U>>
67
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitWritable<U>>
68
+ : T extends WeakSet<infer U> ? WeakSet<DeepOmitWritable<U>>
69
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitWritable<T[K]> }
70
+ : T extends (infer U)[] ? DeepOmitWritable<U>[]
71
+ : { [P in K]: DeepOmitWritable<Exclude<T[P], undefined>> }
72
+
73
+ /**
74
+ * Omit all JSON friendly properties in T deeply
75
+ */
76
+ export type DeepOmitJson<T> = _DeepOmitJson<T>
77
+ type _DeepOmitJson<T, K extends keyof T = Exclude<keyof T, JsonKeys<T>>> =
78
+ T extends Builtin ? T
79
+ : T extends Promise<infer U> ? Promise<DeepOmitJson<U>>
80
+ : T extends Map<infer K, infer V> ? Map<K, DeepOmitJson<V>>
81
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitJson<V>>
82
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitJson<V>>
83
+ : T extends Set<infer U> ? Set<DeepOmitJson<U>>
84
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitJson<U>>
85
+ : T extends WeakSet<infer U> ? WeakSet<DeepOmitJson<U>>
86
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepOmitJson<T[K]> }
87
+ : T extends (infer U)[] ? DeepOmitJson<U>[]
88
+ : { [P in K]: DeepOmitJson<Exclude<T[P], undefined>> };
@@ -0,0 +1,88 @@
1
+ import {Builtin} from './common';
2
+ import {IfTuple} from './type-check';
3
+ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
4
+
5
+ /**
6
+ * Pick all optional properties in T deeply
7
+ */
8
+ export type DeepPickOptional<T> = _DeepPickOptional<T>;
9
+ type _DeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
10
+ T extends Builtin ? T
11
+ : T extends Promise<infer U> ? Promise<DeepPickOptional<U>>
12
+ : T extends Map<infer K, infer V> ? Map<K, DeepPickOptional<V>>
13
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickOptional<V>>
14
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickOptional<V>>
15
+ : T extends Set<infer U> ? Set<DeepPickOptional<U>>
16
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickOptional<U>>
17
+ : T extends WeakSet<infer U> ? WeakSet<DeepPickOptional<U>>
18
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickOptional<T[K]> }
19
+ : T extends (infer U)[] ? DeepPickOptional<U>[]
20
+ : { [P in K]: DeepPickOptional<Exclude<T[P], undefined>> };
21
+
22
+ /**
23
+ * Pick all required properties in T deeply
24
+ */
25
+ export type DeepPickRequired<T> = _DeepPickRequired<T>;
26
+ type _DeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
27
+ T extends Builtin ? T
28
+ : T extends Promise<infer U> ? Promise<DeepPickRequired<U>>
29
+ : T extends Map<infer K, infer V> ? Map<K, DeepPickRequired<V>>
30
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickRequired<V>>
31
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickRequired<V>>
32
+ : T extends Set<infer U> ? Set<DeepPickRequired<U>>
33
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickRequired<U>>
34
+ : T extends WeakSet<infer U> ? WeakSet<DeepPickRequired<U>>
35
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickRequired<T[K]> }
36
+ : T extends (infer U)[] ? DeepPickRequired<U>[]
37
+ : { [P in J]: DeepPickRequired<Exclude<T[P], undefined>> };
38
+
39
+ /**
40
+ * Pick all readonly properties in T deeply
41
+ */
42
+ export type DeepPickReadonly<T> = _DeepPickReadonly<T>;
43
+ type _DeepPickReadonly<T, J extends keyof T = ReadonlyKeys<T>> =
44
+ T extends Builtin ? T
45
+ : T extends Promise<infer U> ? Promise<DeepPickReadonly<U>>
46
+ : T extends Map<infer K, infer V> ? Map<K, DeepPickReadonly<V>>
47
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickReadonly<V>>
48
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickReadonly<V>>
49
+ : T extends Set<infer U> ? Set<DeepPickReadonly<U>>
50
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickReadonly<U>>
51
+ : T extends WeakSet<infer U> ? WeakSet<DeepPickReadonly<U>>
52
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickReadonly<T[K]> }
53
+ : T extends (infer U)[] ? DeepPickReadonly<U>[]
54
+ : { [P in J]: DeepPickReadonly<Exclude<T[P], undefined>> };
55
+
56
+ /**
57
+ * Pick all writable properties in T deeply
58
+ */
59
+ export type DeepPickWritable<T> = _DeepPickWritable<T>
60
+ type _DeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
61
+ T extends Builtin ? T
62
+ : T extends Promise<infer U> ? Promise<DeepPickWritable<U>>
63
+ : T extends Map<infer K, infer V> ? Map<K, DeepPickWritable<V>>
64
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickWritable<V>>
65
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickWritable<V>>
66
+ : T extends Set<infer U> ? Set<DeepPickWritable<U>>
67
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickWritable<U>>
68
+ : T extends WeakSet<infer U> ? WeakSet<DeepPickWritable<U>>
69
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickWritable<T[K]> }
70
+ : T extends (infer U)[] ? DeepPickWritable<U>[]
71
+ : { [P in K]: DeepPickWritable<Exclude<T[P], undefined>> }
72
+
73
+ /**
74
+ * Pick all JSON friendly properties in T deeply
75
+ */
76
+ export type DeepPickJson<T> = _DeepPickJson<T>
77
+ type _DeepPickJson<T, K extends keyof T = JsonKeys<T>> =
78
+ T extends Builtin ? T
79
+ : T extends Promise<infer U> ? Promise<DeepPickJson<U>>
80
+ : T extends Map<infer K, infer V> ? Map<K, DeepPickJson<V>>
81
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickJson<V>>
82
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickJson<V>>
83
+ : T extends Set<infer U> ? Set<DeepPickJson<U>>
84
+ : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickJson<U>>
85
+ : T extends WeakSet<infer U> ? WeakSet<DeepPickJson<U>>
86
+ : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickJson<T[K]> }
87
+ : T extends (infer U)[] ? DeepPickJson<U>[]
88
+ : { [P in K]: DeepPickJson<Exclude<T[P], undefined>> };
package/lib/index.d.ts CHANGED
@@ -1,6 +1,9 @@
1
1
  export * from "./common";
2
2
  export * from "./keys";
3
+ export * from "./type-check";
3
4
  export * from "./modify";
4
- export * from "./omit";
5
+ export * from "./deep-pick";
6
+ export * from "./deep-omit";
7
+ export * from "./deep-modify";
5
8
  export * from "./pick";
6
- export * from "./type-check";
9
+ export * from "./omit";
package/lib/keys.ts CHANGED
@@ -1,48 +1,100 @@
1
- import {IfEquals, IsUndefined} from './type-check';
1
+ import {IfEquals, IfCompatible, IfUndefined, IfAny, IfJson} from './type-check';
2
2
 
3
3
  /**
4
- * Gets optional keys of an object
4
+ * KeyOf
5
+ * @desc Returns the union type of all the keys in a type
5
6
  */
6
- export type OptionalKeys<T> = {
7
- [K in keyof T]-?: {} extends Pick<T, K> ? K : never;
8
- }[keyof T];
7
+ export type KeysOf<T> = keyof T;
9
8
 
10
9
  /**
11
- * Gets required keys of an object
10
+ * ValuesOf
11
+ * @desc Returns the union type of all the values in a type
12
12
  */
13
- export type RequiredKeys<T> = Exclude<keyof T, OptionalKeys<T>>;
13
+ export type ValuesOf<T> = T[keyof T];
14
14
 
15
15
  /**
16
- * Gets Function keys of an object
16
+ * RequiredKeys
17
+ * @desc Returns required keys of an object
17
18
  */
18
- export type FunctionKeys<T> = {
19
- [K in keyof T]-?: IsUndefined<T[K]> extends false ?
20
- T[K] extends Function ? K : never : never;
19
+ export type RequiredKeys<T> = {
20
+ [K in keyof T]-?: IfUndefined<T[K]> extends true
21
+ ? never
22
+ : T extends { [K1 in K]: any } ? K : never
21
23
  }[keyof T];
22
24
 
23
25
  /**
24
- * Gets readonly keys of an object
26
+ * OptionalKeys
27
+ * @desc Returns optional keys of an object
28
+ */
29
+ export type OptionalKeys<T> = {
30
+ [K in keyof T]-?: IfUndefined<T[K]> extends true
31
+ ? never
32
+ : T extends { [K1 in K]: any } ? never : K
33
+ }[keyof T];
34
+
35
+
36
+ /**
37
+ * @desc Returns readonly keys of an object
25
38
  */
26
39
  export type ReadonlyKeys<T> = {
27
40
  [K in keyof T]-?: IfEquals<{ [Q in K]: T[K] }, { -readonly [Q in K]: T[K] }, never, K>
28
41
  }[keyof T];
29
42
 
30
43
  /**
31
- * Gets readable keys of an object
44
+ * @desc Returns non function keys of an object
32
45
  */
33
- export type ReadableKeys<T> = Exclude<keyof T, FunctionKeys<T>>;
46
+ export type NonFunctionKeys<T> = Exclude<keyof T, FunctionKeys<T>>;
47
+
34
48
 
35
49
  /**
36
- * Gets writable keys of an object
50
+ * @desc Returns JSON friendly keys of an object
37
51
  */
38
- export type WritableKeys<T> = Exclude<{
39
- [K in keyof T]-?: IfEquals<{ [Q in K]: T[K] }, { -readonly [Q in K]: T[K] }, K>
40
- }[keyof T], FunctionKeys<T>>;
52
+ export type JsonKeys<T> = _JsonKeys<T>;
53
+ type _JsonKeys<T, J = Required<T>> = ValuesOf<{
54
+ [K in keyof J]: IfUndefined<J[K]> extends true
55
+ ? never
56
+ : K extends symbol
57
+ ? never
58
+ : IfJson<J[K]> extends true
59
+ ? K
60
+ : never
61
+
62
+ }>;
41
63
 
42
64
  /**
43
- * Gets keys that matches V of T
65
+ * @desc Returns writable keys of an object
44
66
  */
45
- type _TypeKeys<T, V> = {
46
- [K in keyof T]: IfEquals<T[K], V, K, never>
47
- }[keyof T];
48
- export type TypeKeys<T, V> = _TypeKeys<Required<T>, V>;
67
+ export type WritableKeys<T> = Exclude<keyof T, ReadonlyKeys<T>>;
68
+
69
+
70
+ /**
71
+ * @desc Returns writable json keys of an object
72
+ */
73
+ export type WritableJsonKeys<T> = Extract<{
74
+ [K in keyof T]-?: IfEquals<{ [Q in K]: T[K] }, { -readonly [Q in K]: T[K] }, K, never>
75
+ }[keyof T], JsonKeys<T>>;
76
+
77
+ /**
78
+ * @desc Returns Function keys of an object
79
+ */
80
+ export type FunctionKeys<T> = ValuesOf<{
81
+ [K in keyof T]-?: IfUndefined<T[K]> extends false ?
82
+ IfAny<T[K]> extends false ?
83
+ T[K] extends Function ? K
84
+ : never : never : never;
85
+ }>;
86
+
87
+ /**
88
+ * @desc Returns keys that match given type
89
+ */
90
+ export type KeysCompatible<T, U> = ValuesOf<{
91
+ [K in keyof T]-?: IfCompatible<T[K], U, K, never>;
92
+ }>;
93
+
94
+ /**
95
+ * @desc Returns keys that equals given type
96
+ */
97
+ export type KeysEquals<T, U> = ValuesOf<{
98
+ [K in keyof T]-?: IfEquals<T[K], U, K, never>;
99
+ }>;
100
+
package/lib/modify.d.ts CHANGED
@@ -1,7 +1,3 @@
1
- /** Like Partial but recursive */
2
- import {Builtin} from './common';
3
- import {IsTuple} from './type-check';
4
-
5
1
  /**
6
2
  * Make all properties in T writable
7
3
  */
@@ -13,91 +9,3 @@ export type Writable<T> = {
13
9
  * Combination of Partial and Writable
14
10
  */
15
11
  export type Buildable<T> = Partial<Writable<T>>;
16
-
17
- /**
18
- * Combination of DeepPartial and DeepWritable
19
- */
20
- export type DeepBuildable<T> = DeepPartial<DeepWritable<T>>;
21
-
22
- /**
23
- * Make all properties in T optional deeply
24
- */
25
- export type DeepPartial<T> =
26
- T extends Builtin ? T
27
- : T extends Map<infer K, infer V> ? Map<K, DeepPartial<V>>
28
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPartial<V>>
29
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPartial<V>>
30
- : T extends Set<infer U> ? Set<DeepPartial<U>>
31
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPartial<U>>
32
- : T extends WeakSet<infer U> ? WeakSet<DeepPartial<U>>
33
- : T extends (infer U)[] ? true extends IsTuple<T>
34
- ? { [K in keyof T]?: DeepPartial<T[K]> } : (DeepPartial<U>)[]
35
- : T extends Promise<infer U> ? Promise<DeepPartial<U>>
36
- : Partial<T>;
37
-
38
- /**
39
- * Make all properties in T required deeply
40
- */
41
- export type DeepRequired<T> =
42
- T extends Builtin ? T
43
- : T extends Map<infer K, infer V> ? Map<K, DeepRequired<V>>
44
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepRequired<V>>
45
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepRequired<V>>
46
- : T extends Set<infer U> ? Set<DeepRequired<U>>
47
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepRequired<U>>
48
- : T extends WeakSet<infer U> ? WeakSet<DeepRequired<U>>
49
- : T extends (infer U)[] ? true extends IsTuple<T>
50
- ? { [K in keyof T]?: DeepRequired<T[K]> } : (DeepRequired<U>)[]
51
- : T extends Promise<infer U> ? Promise<DeepRequired<U>>
52
- : Required<T>;
53
-
54
- /**
55
- * Make all properties in T readonly deeply
56
- */
57
- export type DeepReadonly<T> =
58
- T extends Builtin ? T
59
- : T extends Map<infer K, infer V> ? Map<K, DeepReadonly<V>>
60
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepReadonly<V>>
61
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepReadonly<V>>
62
- : T extends Set<infer U> ? Set<DeepReadonly<U>>
63
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepReadonly<U>>
64
- : T extends WeakSet<infer U> ? WeakSet<DeepReadonly<U>>
65
- : T extends (infer U)[] ? true extends IsTuple<T>
66
- ? { [K in keyof T]?: DeepReadonly<T[K]> } : (DeepReadonly<U>)[]
67
- : T extends Promise<infer U> ? Promise<DeepReadonly<U>>
68
- : Readonly<T>;
69
-
70
- /**
71
- * Make all properties in T writable deeply
72
- */
73
- export type DeepWritable<T> =
74
- T extends Builtin ? T
75
- : T extends Map<infer K, infer V> ? Map<K, DeepWritable<V>>
76
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepWritable<V>>
77
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepWritable<V>>
78
- : T extends Set<infer U> ? Set<DeepWritable<U>>
79
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepWritable<U>>
80
- : T extends WeakSet<infer U> ? WeakSet<DeepWritable<U>>
81
- : T extends (infer U)[] ? true extends IsTuple<T>
82
- ? { [K in keyof T]?: DeepWritable<T[K]> } : (DeepWritable<U>)[]
83
- : T extends Promise<infer U> ? Promise<DeepWritable<U>>
84
- : Writable<T>;
85
-
86
- /**
87
- * Make all properties in T nullable deeply
88
- */
89
- export type DeepNullable<T> =
90
- T extends Builtin ? T
91
- : T extends Map<infer K, infer V> ? Map<K, DeepNullable<V>>
92
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepNullable<V>>
93
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepNullable<V>>
94
- : T extends Set<infer U> ? Set<DeepNullable<U>>
95
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepNullable<U>>
96
- : T extends WeakSet<infer U> ? WeakSet<DeepNullable<U>>
97
- : T extends (infer U)[] ? true extends IsTuple<T>
98
- ? { [K in keyof T]?: DeepNullable<T[K]> } : (DeepNullable<U>)[]
99
- : T extends Promise<infer U> ? Promise<DeepNullable<U>>
100
- : T extends {}
101
- ? { [K in keyof T]: DeepNullable<T[K]> }
102
- : T | null | undefined;
103
-
package/lib/omit.d.ts CHANGED
@@ -1,116 +1,27 @@
1
- /** Like Partial but recursive */
2
- import {Builtin} from './common';
3
- import {IsTuple} from './type-check';
4
- import {OptionalKeys, ReadonlyKeys, RequiredKeys, TypeKeys, WritableKeys} from './keys';
1
+ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
5
2
 
6
3
  /**
7
- * Omit all optional properties in object type
4
+ * Omit all optional properties in T
8
5
  */
9
6
  export type OmitOptional<T> = Omit<T, OptionalKeys<T>>;
10
7
 
11
8
  /**
12
- * Omit all required properties in object type
9
+ * Omit all required properties in T
13
10
  */
14
11
  export type OmitRequired<T> = Omit<T, RequiredKeys<T>>;
15
12
 
16
13
  /**
17
- * Omit all readonly properties in object type
14
+ * Omit all readonly properties in T
18
15
  */
19
16
  export type OmitReadonly<T> = Omit<T, ReadonlyKeys<T>>;
20
17
 
21
- /**
22
- * Omit all writable properties in object type
23
- */
24
- export type OmitWritable<T> = Omit<T, WritableKeys<T>>;
25
-
26
- /**
27
- * Omit all properties of given type in object type
28
- */
29
- export type OmitType<T, S> = Omit<T, TypeKeys<T, S>>;
30
-
31
-
32
- /**
33
- * Omit all optional properties in T deeply
34
- */
35
- export type DeepOmitOptional<T> =
36
- T extends Builtin ? T
37
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitOptional<V>>
38
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitOptional<V>>
39
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitOptional<V>>
40
- : T extends Set<infer U> ? Set<DeepOmitOptional<U>>
41
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitOptional<U>>
42
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitOptional<U>>
43
- : T extends (infer U)[] ? T extends IsTuple<T>
44
- ? { [K in ReadonlyKeys<T>]?: DeepOmitOptional<T[K]> } : (DeepOmitOptional<U>)[]
45
- : T extends Promise<infer U> ? Promise<DeepOmitOptional<U>>
46
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepOmitOptional<T[K]> }
47
- : OmitOptional<T>;
48
-
49
-
50
- /**
51
- * Omit all non optional properties in T deeply
52
- */
53
- export type DeepOmitRequired<T> =
54
- T extends Builtin ? T
55
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitRequired<V>>
56
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitRequired<V>>
57
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitRequired<V>>
58
- : T extends Set<infer U> ? Set<DeepOmitRequired<U>>
59
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitRequired<U>>
60
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitRequired<U>>
61
- : T extends (infer U)[] ? T extends IsTuple<T>
62
- ? { [K in ReadonlyKeys<T>]?: DeepOmitRequired<T[K]> } : (DeepOmitRequired<U>)[]
63
- : T extends Promise<infer U> ? Promise<DeepOmitRequired<U>>
64
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepOmitRequired<T[K]> }
65
- : OmitRequired<T>;
66
18
 
67
19
  /**
68
- * Omit all readonly properties in T deeply
20
+ * Omit all writable properties in T
69
21
  */
70
- export type DeepOmitReadonly<T> =
71
- T extends Builtin ? T
72
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitReadonly<V>>
73
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitReadonly<V>>
74
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitReadonly<V>>
75
- : T extends Set<infer U> ? Set<DeepOmitReadonly<U>>
76
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitReadonly<U>>
77
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitReadonly<U>>
78
- : T extends (infer U)[] ? T extends IsTuple<T>
79
- ? { [K in ReadonlyKeys<T>]?: DeepOmitReadonly<T[K]> } : (DeepOmitReadonly<U>)[]
80
- : T extends Promise<infer U> ? Promise<DeepOmitReadonly<U>>
81
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepOmitReadonly<T[K]> }
82
- : OmitReadonly<T>;
83
-
84
- /**
85
- * Omit all non readonly properties in T deeply
86
- */
87
- export type DeepOmitWritable<T> =
88
- T extends Builtin ? T
89
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitWritable<V>>
90
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitWritable<V>>
91
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitWritable<V>>
92
- : T extends Set<infer U> ? Set<DeepOmitWritable<U>>
93
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitWritable<U>>
94
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitWritable<U>>
95
- : T extends (infer U)[] ? T extends IsTuple<T>
96
- ? { [K in WritableKeys<T>]?: DeepOmitWritable<T[K]> } : (DeepOmitWritable<U>)[]
97
- : T extends Promise<infer U> ? Promise<DeepOmitWritable<U>>
98
- : T extends {} ? { [K in WritableKeys<T>]?: DeepOmitWritable<T[K]> }
99
- : OmitWritable<T>;
22
+ export type OmitWritable<T> = Omit<T, WritableKeys<T>>;
100
23
 
101
24
  /**
102
- * Omit properties in given type in T deeply
25
+ * Omit all JSON friendly properties in T
103
26
  */
104
- export type DeepOmitType<T, S> =
105
- T extends Builtin ? T
106
- : T extends Map<infer K, infer V> ? Map<K, DeepOmitType<V, S>>
107
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepOmitType<V, S>>
108
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepOmitType<V, S>>
109
- : T extends Set<infer U> ? Set<DeepOmitType<U, S>>
110
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepOmitType<U, S>>
111
- : T extends WeakSet<infer U> ? WeakSet<DeepOmitType<U, S>>
112
- : T extends (infer U)[] ? T extends IsTuple<T>
113
- ? { [K in ReadonlyKeys<T>]?: DeepOmitType<T[K], S> } : (DeepOmitType<U, S>)[]
114
- : T extends Promise<infer U> ? Promise<DeepOmitType<U, S>>
115
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepOmitType<T[K], S> }
116
- : OmitType<T, S>;
27
+ export type OmitJson<T> = Omit<T, JsonKeys<T>>;
package/lib/pick.d.ts CHANGED
@@ -1,120 +1,27 @@
1
- /** Like Partial but recursive */
2
- import {Builtin} from './common';
3
- import {IsTuple} from './type-check';
4
- import {OptionalKeys, ReadableKeys, ReadonlyKeys, RequiredKeys, TypeKeys, WritableKeys} from './keys';
1
+ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
5
2
 
6
3
  /**
7
- * Pick all optional properties in object type
4
+ * Pick all optional properties in T
8
5
  */
9
6
  export type PickOptional<T> = Pick<T, OptionalKeys<T>>;
10
7
 
11
8
  /**
12
- * Pick all required properties in object type
9
+ * Pick all required properties in T
13
10
  */
14
11
  export type PickRequired<T> = Pick<T, RequiredKeys<T>>;
15
12
 
16
13
  /**
17
- * Pick all readonly properties in object type
14
+ * Pick all readonly properties in T
18
15
  */
19
16
  export type PickReadonly<T> = Pick<T, ReadonlyKeys<T>>;
20
17
 
21
- /**
22
- * Pick all readable properties in object type
23
- */
24
- export type PickReadable<T> = Pick<T, ReadableKeys<T>>;
25
18
 
26
19
  /**
27
- * Pick all writable properties in object type
20
+ * Pick all writable properties in T
28
21
  */
29
22
  export type PickWritable<T> = Pick<T, WritableKeys<T>>;
30
23
 
31
24
  /**
32
- * Pick all properties of given type in object type
33
- */
34
- export type PickType<T, S> = Pick<T, TypeKeys<T, S>>;
35
-
36
- /**
37
- * Pick all optional properties in T deeply
38
- */
39
- export type DeepPickOptional<T> =
40
- T extends Builtin ? T
41
- : T extends Map<infer K, infer V> ? Map<K, DeepPickOptional<V>>
42
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickOptional<V>>
43
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickOptional<V>>
44
- : T extends Set<infer U> ? Set<DeepPickOptional<U>>
45
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickOptional<U>>
46
- : T extends WeakSet<infer U> ? WeakSet<DeepPickOptional<U>>
47
- : T extends (infer U)[] ? T extends IsTuple<T>
48
- ? { [K in ReadonlyKeys<T>]?: DeepPickOptional<T[K]> } : (DeepPickOptional<U>)[]
49
- : T extends Promise<infer U> ? Promise<DeepPickOptional<U>>
50
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickOptional<T[K]> }
51
- : PickOptional<T>;
52
-
53
-
54
- /**
55
- * Pick all non optional properties in T deeply
56
- */
57
- export type DeepPickRequired<T> =
58
- T extends Builtin ? T
59
- : T extends Map<infer K, infer V> ? Map<K, DeepPickRequired<V>>
60
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickRequired<V>>
61
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickRequired<V>>
62
- : T extends Set<infer U> ? Set<DeepPickRequired<U>>
63
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickRequired<U>>
64
- : T extends WeakSet<infer U> ? WeakSet<DeepPickRequired<U>>
65
- : T extends (infer U)[] ? T extends IsTuple<T>
66
- ? { [K in ReadonlyKeys<T>]?: DeepPickRequired<T[K]> } : (DeepPickRequired<U>)[]
67
- : T extends Promise<infer U> ? Promise<DeepPickRequired<U>>
68
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickRequired<T[K]> }
69
- : PickRequired<T>;
70
-
71
- /**
72
- * Pick all readonly properties in T deeply
73
- */
74
- export type DeepPickReadonly<T> =
75
- T extends Builtin ? T
76
- : T extends Map<infer K, infer V> ? Map<K, DeepPickReadonly<V>>
77
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickReadonly<V>>
78
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickReadonly<V>>
79
- : T extends Set<infer U> ? Set<DeepPickReadonly<U>>
80
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickReadonly<U>>
81
- : T extends WeakSet<infer U> ? WeakSet<DeepPickReadonly<U>>
82
- : T extends (infer U)[] ? T extends IsTuple<T>
83
- ? { [K in ReadonlyKeys<T>]?: DeepPickReadonly<T[K]> } : (DeepPickReadonly<U>)[]
84
- : T extends Promise<infer U> ? Promise<DeepPickReadonly<U>>
85
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickReadonly<T[K]> }
86
- : PickReadonly<T>;
87
-
88
- /**
89
- * Pick all non readonly properties in T deeply
90
- */
91
- export type DeepPickWritable<T> =
92
- T extends Builtin ? T
93
- : T extends Map<infer K, infer V> ? Map<K, DeepPickWritable<V>>
94
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickWritable<V>>
95
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickWritable<V>>
96
- : T extends Set<infer U> ? Set<DeepPickWritable<U>>
97
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickWritable<U>>
98
- : T extends WeakSet<infer U> ? WeakSet<DeepPickWritable<U>>
99
- : T extends (infer U)[] ? T extends IsTuple<T>
100
- ? { [K in WritableKeys<T>]?: DeepPickWritable<T[K]> } : (DeepPickWritable<U>)[]
101
- : T extends Promise<infer U> ? Promise<DeepPickWritable<U>>
102
- : T extends {} ? { [K in WritableKeys<T>]?: DeepPickWritable<T[K]> }
103
- : PickWritable<T>;
104
-
105
- /**
106
- * Pick properties in given type in T deeply
25
+ * Pick all JSON friendly properties (no symbols) in T
107
26
  */
108
- export type DeepPickType<T, S> =
109
- T extends Builtin ? T
110
- : T extends Map<infer K, infer V> ? Map<K, DeepPickType<V, S>>
111
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickType<V, S>>
112
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickType<V, S>>
113
- : T extends Set<infer U> ? Set<DeepPickType<U, S>>
114
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickType<U, S>>
115
- : T extends WeakSet<infer U> ? WeakSet<DeepPickType<U, S>>
116
- : T extends (infer U)[] ? T extends IsTuple<T>
117
- ? { [K in ReadonlyKeys<T>]?: DeepPickType<T[K], S> } : (DeepPickType<U, S>)[]
118
- : T extends Promise<infer U> ? Promise<DeepPickType<U, S>>
119
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickType<T[K], S> }
120
- : PickType<T, S>;
27
+ export type PickJson<T> = Pick<T, JsonKeys<T>>;
@@ -1,110 +1,160 @@
1
- import {NonObj} from './common';
1
+ import {Primitive, Type} from './common';
2
2
 
3
- /**
4
- * Returns Y if typeof T is "never", N otherwise
5
- */
6
- export type IsExtends<T, U> = [T] extends [U] ? true : false;
3
+ type NonObj = Primitive | Function;
7
4
 
8
5
  /**
9
- * Returns Y if typeof T is "never", N otherwise
6
+ * Returns Y if typeof T is "any", N otherwise
10
7
  */
11
- export type IfNever<T, Y, N = never> = [T] extends [never] ? Y : N;
8
+ export type IfAny<T, Y = true, N = false> =
9
+ 0 extends 1 & T ? Y : N;
12
10
 
13
11
  /**
14
- * Returns true if typeof T is "never", false otherwise
12
+ * Returns "Y" if "T" is "never", "N" otherwise
15
13
  */
16
- export type IsNever<T> = IfNever<T, true, false>;
14
+ export type IfNever<T, Y = true, N = false> =
15
+ [T] extends [never] ? Y : N;
17
16
 
18
17
  /**
19
- * Returns Y if typeof T is "any", N otherwise
18
+ * Returns Y if T is undefined, N otherwise
20
19
  */
21
- export type IfAny<T, Y = T, N = never> = 0 extends (1 & T) ? Y : N;
20
+ export type IfUndefined<T, Y = true, N = false> =
21
+ IfEquals<T, undefined, Y, N>;
22
22
 
23
23
  /**
24
- * Returns true if typeof T is "any", false otherwise
24
+ * Returns Y if typeof T is "unknown", N otherwise
25
25
  */
26
- export type IsAny<T> = IfAny<T, true, false>;
26
+ export type IfUnknown<T, Y = true, N = false> =
27
+ IfEquals<T, unknown, Y, N>;
27
28
 
28
29
  /**
29
- * Returns Y if typeof T is "unknown", N otherwise
30
+ * Returns Y if typeof T is null, N otherwise
30
31
  */
31
- export type IfUnknown<T, Y, N = never> =
32
- unknown extends T ?
33
- IsAny<T> extends false
34
- ? IfEmptyObject<T, N, Y>
35
- : N
36
- : N;
32
+ export type IfNull<T, Y = true, N = false> =
33
+ IfEquals<T, null, Y, N>;
34
+
37
35
  /**
38
- * Returns true if typeof T is "unknown", false otherwise
36
+ * Returns Y if typeof T is null, N otherwise
39
37
  */
40
- export type IsUnknown<T> = IfUnknown<T, true, false>;
38
+ export type IfNullish<T, Y = true, N = false> =
39
+ IfNever<T> extends true ? N
40
+ : T extends null ? Y
41
+ : T extends undefined ? Y : N;
42
+
41
43
 
42
44
  /**
43
45
  * Returns Y if typeof T is a tuple, N otherwise
44
46
  */
45
- export type IfTuple<T, Y = T, N = never> =
46
- IsNever<T> extends true
47
- ? N
48
- : T extends any[]
47
+ export type IfTuple<T, Y = true, N = false> =
48
+ IfEquals<T, [any]> extends true
49
+ ? T extends [any]
49
50
  ? number extends T['length'] ? N : Y
50
- : N;
51
+ : N : N;
52
+ export type IfTupleOrAny<T, Y = true, N = false> =
53
+ IfAny<T> extends true ? Y : IfTuple<T, Y, N>;
51
54
 
52
55
  /**
53
- * Returns true if typeof T is a tuple, false otherwise
56
+ * Returns Y if typeof T is "Primitive", N otherwise
54
57
  */
55
- export type IsTuple<T> = IfTuple<T, true, false>;
58
+ export type IfPrimitive<T, Y = true, N = false> =
59
+ IfNever<T> extends true ? N :
60
+ IfClass<T> extends true ? N :
61
+ IfFunction<T> extends true ? N :
62
+ T extends Primitive ? Y :
63
+ N;
56
64
 
57
- /**
58
- * Returns Y if typeof T is an object, N otherwise
59
- */
60
- export type IfObject<T, Y = T, N = never> =
61
- IfNever<T, N,
62
- T extends object
63
- ? T extends NonObj | any[]
64
- ? N
65
- : Y
66
- : N>;
65
+ export type IfPrimitiveOrAny<T, Y = true, N = false> =
66
+ IfAny<T> extends true ? Y : IfPrimitive<T, Y, N>;
67
67
 
68
68
  /**
69
- * Returns true if typeof T is an object, false otherwise
69
+ * Returns Y if typeof T is JSON like, N otherwise
70
70
  */
71
- export type IsObject<T> = IfObject<T, true, false>;
71
+ export type IfJson<T, Y = true, N = false> =
72
+ IfNull<T> extends true ? Y :
73
+ IfNever<T> extends true ? N :
74
+ IfUnknown<T> extends true ? N :
75
+ IfClass<T> extends true ? N :
76
+ IfFunction<T> extends true ? N :
77
+ IfUndefined<T> extends true ? N :
78
+ T extends symbol ? N :
79
+ T extends (infer U)[] ? IfJson<U> extends true ? Y : N
80
+ : Y;
81
+
82
+ export type IfJsonOrAny<T, Y = true, N = false> =
83
+ IfAny<T> extends true ? Y : IfJson<T, Y, N>;
72
84
 
73
85
  /**
74
86
  * Returns Y if typeof T is an empty object, N otherwise
75
87
  */
76
- export type IfEmptyObject<T extends {}, Y = T, N = never> =
77
- IsNever<T> extends true
78
- ? N
79
- : T extends object
80
- ? keyof T extends never ? Y : N
81
- : N
88
+ export type IfEmptyObject<T, Y = true, N = false> =
89
+ IfEquals<T, {}, Y, N>;
82
90
 
83
91
  /**
84
- * Returns true if typeof T is an empty object, false otherwise
92
+ * Returns Y if typeof T is an object, N otherwise
85
93
  */
86
- export type IsEmptyObject<T extends {}> = IfEmptyObject<T, true, false>;
94
+ export type IfObject<T, Y = true, N = false> =
95
+ IfNever<T> extends true ? N
96
+ : T extends object
97
+ ? T extends NonObj | any[]
98
+ ? N
99
+ : Y
100
+ : N;
87
101
 
102
+ export type IfObjectOrAny<T, Y = true, N = false> =
103
+ IfAny<T> extends true ? Y : IfObject<T, Y, N>;
88
104
 
89
105
  /**
90
- * Returns Y if T1 is exactly same with T2, N otherwise
106
+ * Returns Y if typeof T is an empty object, N otherwise
91
107
  */
92
- type IfEquals<T1, T2, Y = T1, N = never> =
93
- (<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? Y : N;
108
+ export type IfFunction<T, Y = true, N = false> =
109
+ IfNever<T> extends true ? N
110
+ : IfUndefined<T> extends true ? N
111
+ : IfNull<T> extends true ? N
112
+ : T extends Function ? Y
113
+ : N;
114
+
115
+ export type IfFunctionOrAny<T, Y = true, N = false> =
116
+ IfAny<T> extends true ? Y : IfFunction<T, Y, N>;
94
117
 
95
118
  /**
96
- * Returns true if T1 is exactly same with T2, false otherwise
119
+ * Returns Y if typeof T is an empty object, N otherwise
97
120
  */
98
- export type IsEquals<T1, T2> = IfEquals<T1, T2, true, false>;
121
+ export type IfClass<T, Y = true, N = false> =
122
+ IfNever<T> extends true ? N
123
+ : IfUndefined<T> extends true ? N
124
+ : IfNull<T> extends true ? N
125
+ : T extends Type ? Y
126
+ : N;
127
+
128
+ export type IfClassOrAny<T, Y = true, N = false> =
129
+ IfAny<T> extends true ? Y : IfClass<T, Y, N>;
99
130
 
100
131
 
101
132
  /**
102
- * Returns Y if T1 is exactly same with T2, N otherwise
133
+ * Returns "Y" if "T1" is exactly same with "T2", "N" otherwise
103
134
  */
104
- export type IfUndefined<T, Y = T, N = never> =
105
- T extends undefined ? Y: N;
135
+ type IfEquals<T1, T2, Y = true, N = false> =
136
+ (<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? Y : N;
106
137
 
107
138
  /**
108
- * Returns true if T is undefined type
109
- */
110
- export type IsUndefined<T> = IfUndefined<T, true, false>;
139
+ * Returns "Y" if type "T" matches "U", "N" otherwise
140
+ */
141
+ export type IfCompatible<T1, T2, Y = true, N = false> =
142
+ IfUndefined<T1> extends true ? IfEquals<T1, T2, Y, N> : IfUndefined<T2> extends true ? N
143
+ : IfNever<T1> extends true ? IfEquals<T1, T2, Y, N> : IfNever<T2> extends true ? N
144
+ : IfNull<T1> extends true ? IfEquals<T1, T2, Y, N> : IfNull<T2> extends true ? N
145
+ : IfUnknown<T1> extends true ? Y : IfUnknown<T2> extends true ? Y
146
+ : IfAny<T1> extends true ? Y : IfAny<T2> extends true ? Y
147
+ : IfEmptyObject<T1> extends true ? IfObject<T2, Y, N>
148
+ : IfEmptyObject<T2> extends true ? IfObject<T1, Y, N>
149
+ : IfFunction<T1> extends true ? IfCompatibleFunction<T1, T2, Y, N>
150
+ : IfObject<T1> extends true ? [T1] extends [T2] ? Y : N
151
+ : [T1] extends [T2] ? Y
152
+ : IfPrimitive<T2> extends true ? [T2] extends [T1] ? Y
153
+ : N : N;
154
+
155
+ type IfCompatibleFunction<T1, T2, Y = true, N = false> =
156
+ IfFunction<T1> extends false ? N
157
+ : IfFunction<T2> extends false ? N
158
+ : T1 extends T2
159
+ ? Y
160
+ : N;
package/package.json CHANGED
@@ -12,14 +12,14 @@
12
12
  "lodash",
13
13
  "underscore"
14
14
  ],
15
- "version": "0.0.3",
15
+ "version": "1.1.1",
16
16
  "types": "lib/index.d.ts",
17
17
  "repository": "git@github.com:panates/ts-gems.git",
18
18
  "author": "Eray Hanoglu <e.hanoglu@panates.com>",
19
19
  "license": "MIT",
20
20
  "scripts": {
21
- "test:common": "jest --clearCache && jest --config=./test/jest.config.js",
22
- "test:strict-null": "jest --clearCache && jest --config=./test/jest.strict-null.config.js",
21
+ "test:common": "jest --clearCache && jest --config=./jest.config.js",
22
+ "test:strict-null": "jest --clearCache && jest --config=./jest.strict-null.config.js",
23
23
  "test": "npm run test:common && npm run test:strict-null",
24
24
  "release": "npm run test && npm publish"
25
25
  },
@@ -32,9 +32,10 @@
32
32
  "typescript": ">=4.0.0"
33
33
  },
34
34
  "devDependencies": {
35
- "@types/jest": "^27.0.2",
36
- "prettier": "^2.4.1",
37
- "ts-jest": "^27.0.5",
38
- "typescript": "^4.4.3"
35
+ "@types/jest": "^27.4.0",
36
+ "jest": "^27.4.7",
37
+ "prettier": "^2.5.1",
38
+ "ts-jest": "^27.1.3",
39
+ "typescript": "^4.5.5"
39
40
  }
40
41
  }