ts-gems 0.0.1 → 1.1.0

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,8 @@
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";
5
7
  export * from "./pick";
6
- export * from "./type-check";
8
+ export * from "./omit";
package/lib/keys.ts CHANGED
@@ -1,37 +1,100 @@
1
- import {IfEquals, IsEquals} 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> = keyof {
7
- [K in keyof T as IsEquals<{ [P in K]+?: T[K]; }, { [P in K]: T[K]; }> extends true
8
- ? K
9
- : never
10
- ]: T[K];
11
- };
7
+ export type KeysOf<T> = keyof T;
12
8
 
9
+ /**
10
+ * ValuesOf
11
+ * @desc Returns the union type of all the values in a type
12
+ */
13
+ export type ValuesOf<T> = T[keyof T];
13
14
 
14
15
  /**
15
- * Gets required keys of an object
16
+ * RequiredKeys
17
+ * @desc Returns required keys of an object
16
18
  */
17
- export type RequiredKeys<T> = Exclude<keyof T, OptionalKeys<T>>;
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
23
+ }[keyof T];
24
+
25
+ /**
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
+
18
35
 
19
36
  /**
20
- * Gets readonly keys of an object
37
+ * @desc Returns readonly keys of an object
21
38
  */
22
39
  export type ReadonlyKeys<T> = {
23
40
  [K in keyof T]-?: IfEquals<{ [Q in K]: T[K] }, { -readonly [Q in K]: T[K] }, never, K>
24
41
  }[keyof T];
25
42
 
26
43
  /**
27
- * Gets readonly keys of an object
44
+ * @desc Returns non function keys of an object
45
+ */
46
+ export type NonFunctionKeys<T> = Exclude<keyof T, FunctionKeys<T>>;
47
+
48
+
49
+ /**
50
+ * @desc Returns JSON friendly keys of an object
51
+ */
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
+ }>;
63
+
64
+ /**
65
+ * @desc Returns writable keys of an object
28
66
  */
29
67
  export type WritableKeys<T> = Exclude<keyof T, ReadonlyKeys<T>>;
30
68
 
69
+
31
70
  /**
32
- * Gets keys that matches V of T
71
+ * @desc Returns writable json keys of an object
33
72
  */
34
- type _TypeKeys<T, V> = {
35
- [K in keyof T]: IfEquals<T[K], V, K, never>
36
- }[keyof T];
37
- export type TypeKeys<T, V> = _TypeKeys<Required<T>, V>;
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,121 +1,27 @@
1
- /** Like Partial but recursive */
2
- import {Builtin} from './common';
3
- import {IsTuple} from './type-check';
4
- import {KnownKeys, OptionalKeys, 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 writable properties in object type
23
- */
24
- export type PickWritable<T> = Pick<T, WritableKeys<T>>;
25
-
26
- /**
27
- * Pick all properties of given type in object type
28
- */
29
- export type PickType<T, S> = Pick<T, TypeKeys<T, S>>;
30
18
 
31
19
  /**
32
- * Pick all known properties in object type
20
+ * Pick all writable properties in T
33
21
  */
34
- export type PickKnown<T> = Pick<T, KnownKeys<T>>;
35
-
36
-
37
- /**
38
- * Pick all optional properties in T deeply
39
- */
40
- export type DeepPickOptional<T> =
41
- T extends Builtin ? T
42
- : T extends Map<infer K, infer V> ? Map<K, DeepPickOptional<V>>
43
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickOptional<V>>
44
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickOptional<V>>
45
- : T extends Set<infer U> ? Set<DeepPickOptional<U>>
46
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickOptional<U>>
47
- : T extends WeakSet<infer U> ? WeakSet<DeepPickOptional<U>>
48
- : T extends (infer U)[] ? T extends IsTuple<T>
49
- ? { [K in ReadonlyKeys<T>]?: DeepPickOptional<T[K]> } : (DeepPickOptional<U>)[]
50
- : T extends Promise<infer U> ? Promise<DeepPickOptional<U>>
51
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickOptional<T[K]> }
52
- : PickOptional<T>;
53
-
54
-
55
- /**
56
- * Pick all non optional properties in T deeply
57
- */
58
- export type DeepPickRequired<T> =
59
- T extends Builtin ? T
60
- : T extends Map<infer K, infer V> ? Map<K, DeepPickRequired<V>>
61
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickRequired<V>>
62
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickRequired<V>>
63
- : T extends Set<infer U> ? Set<DeepPickRequired<U>>
64
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickRequired<U>>
65
- : T extends WeakSet<infer U> ? WeakSet<DeepPickRequired<U>>
66
- : T extends (infer U)[] ? T extends IsTuple<T>
67
- ? { [K in ReadonlyKeys<T>]?: DeepPickRequired<T[K]> } : (DeepPickRequired<U>)[]
68
- : T extends Promise<infer U> ? Promise<DeepPickRequired<U>>
69
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickRequired<T[K]> }
70
- : PickRequired<T>;
71
-
72
- /**
73
- * Pick all readonly properties in T deeply
74
- */
75
- export type DeepPickReadonly<T> =
76
- T extends Builtin ? T
77
- : T extends Map<infer K, infer V> ? Map<K, DeepPickReadonly<V>>
78
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickReadonly<V>>
79
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickReadonly<V>>
80
- : T extends Set<infer U> ? Set<DeepPickReadonly<U>>
81
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickReadonly<U>>
82
- : T extends WeakSet<infer U> ? WeakSet<DeepPickReadonly<U>>
83
- : T extends (infer U)[] ? T extends IsTuple<T>
84
- ? { [K in ReadonlyKeys<T>]?: DeepPickReadonly<T[K]> } : (DeepPickReadonly<U>)[]
85
- : T extends Promise<infer U> ? Promise<DeepPickReadonly<U>>
86
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickReadonly<T[K]> }
87
- : PickReadonly<T>;
88
-
89
- /**
90
- * Pick all non readonly properties in T deeply
91
- */
92
- export type DeepPickWritable<T> =
93
- T extends Builtin ? T
94
- : T extends Map<infer K, infer V> ? Map<K, DeepPickWritable<V>>
95
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickWritable<V>>
96
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickWritable<V>>
97
- : T extends Set<infer U> ? Set<DeepPickWritable<U>>
98
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickWritable<U>>
99
- : T extends WeakSet<infer U> ? WeakSet<DeepPickWritable<U>>
100
- : T extends (infer U)[] ? T extends IsTuple<T>
101
- ? { [K in WritableKeys<T>]?: DeepPickWritable<T[K]> } : (DeepPickWritable<U>)[]
102
- : T extends Promise<infer U> ? Promise<DeepPickWritable<U>>
103
- : T extends {} ? { [K in WritableKeys<T>]?: DeepPickWritable<T[K]> }
104
- : PickWritable<T>;
22
+ export type PickWritable<T> = Pick<T, WritableKeys<T>>;
105
23
 
106
24
  /**
107
- * Pick properties in given type in T deeply
25
+ * Pick all JSON friendly properties (no symbols) in T
108
26
  */
109
- export type DeepPickType<T, S> =
110
- T extends Builtin ? T
111
- : T extends Map<infer K, infer V> ? Map<K, DeepPickType<V, S>>
112
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickType<V, S>>
113
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickType<V, S>>
114
- : T extends Set<infer U> ? Set<DeepPickType<U, S>>
115
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickType<U, S>>
116
- : T extends WeakSet<infer U> ? WeakSet<DeepPickType<U, S>>
117
- : T extends (infer U)[] ? T extends IsTuple<T>
118
- ? { [K in ReadonlyKeys<T>]?: DeepPickType<T[K], S> } : (DeepPickType<U, S>)[]
119
- : T extends Promise<infer U> ? Promise<DeepPickType<U, S>>
120
- : T extends {} ? { [K in ReadonlyKeys<T>]?: DeepPickType<T[K], S> }
121
- : PickType<T, S>;
27
+ export type PickJson<T> = Pick<T, JsonKeys<T>>;
@@ -1,98 +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>;
54
+
55
+ /**
56
+ * Returns Y if typeof T is "Primitive", N otherwise
57
+ */
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;
64
+
65
+ export type IfPrimitiveOrAny<T, Y = true, N = false> =
66
+ IfAny<T> extends true ? Y : IfPrimitive<T, Y, N>;
51
67
 
52
68
  /**
53
- * Returns true if typeof T is a tuple, false otherwise
69
+ * Returns Y if typeof T is JSON like, N otherwise
54
70
  */
55
- export type IsTuple<T> = IfTuple<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>;
84
+
85
+ /**
86
+ * Returns Y if typeof T is an empty object, N otherwise
87
+ */
88
+ export type IfEmptyObject<T, Y = true, N = false> =
89
+ IfEquals<T, {}, Y, N>;
56
90
 
57
91
  /**
58
92
  * Returns Y if typeof T is an object, N otherwise
59
93
  */
60
- export type IfObject<T, Y = T, N = never> =
61
- IfNever<T, N,
62
- T extends object
94
+ export type IfObject<T, Y = true, N = false> =
95
+ IfNever<T> extends true ? N
96
+ : T extends object
63
97
  ? T extends NonObj | any[]
64
98
  ? N
65
99
  : Y
66
- : N>;
100
+ : N;
67
101
 
68
- /**
69
- * Returns true if typeof T is an object, false otherwise
70
- */
71
- export type IsObject<T> = IfObject<T, true, false>;
102
+ export type IfObjectOrAny<T, Y = true, N = false> =
103
+ IfAny<T> extends true ? Y : IfObject<T, Y, N>;
72
104
 
73
105
  /**
74
106
  * Returns Y if typeof T is an empty object, N otherwise
75
107
  */
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
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>;
82
117
 
83
118
  /**
84
- * Returns true if typeof T is an empty object, false otherwise
119
+ * Returns Y if typeof T is an empty object, N otherwise
85
120
  */
86
- export type IsEmptyObject<T extends {}> = IfEmptyObject<T, 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>;
87
130
 
88
131
 
89
132
  /**
90
- * Returns Y if T1 is exactly same with T2, N otherwise
133
+ * Returns "Y" if "T1" is exactly same with "T2", "N" otherwise
91
134
  */
92
- type IfEquals<T1, T2, Y = T1, N = never> =
135
+ type IfEquals<T1, T2, Y = true, N = false> =
93
136
  (<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? Y : N;
94
137
 
95
138
  /**
96
- * Returns true if T1 is exactly same with T2, false otherwise
139
+ * Returns "Y" if type "T" matches "U", "N" otherwise
97
140
  */
98
- export type IsEquals<T1, T2> = IfEquals<T1, T2, true, false>;
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.1",
15
+ "version": "1.1.0",
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
  }