ts-gems 1.5.2 → 2.2.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
@@ -68,11 +68,11 @@ export type ElementType<T extends { [P in K & any]: any },
68
68
 
69
69
 
70
70
  /**
71
- * Class
71
+ * Type
72
72
  * @desc Represents constructor of type T
73
73
  */
74
74
  export interface Type<T = any> {
75
- new(...args: any[]): T;
75
+ new(...args: any[]): T;
76
76
  }
77
77
 
78
78
  /**
@@ -81,3 +81,18 @@ export interface Type<T = any> {
81
81
  */
82
82
  export type Class<Args extends any[] = any[], Instance = {}, Static = {}> =
83
83
  (new(...args: Args) => Instance) & Static;
84
+
85
+ /**
86
+ * NoUnion
87
+ * @desc Returns "never" if the type is union
88
+ */
89
+ type NoUnion<T, U = T> = T extends U ? [U] extends [T] ? T : never : never;
90
+
91
+
92
+ /**
93
+ * Opaque
94
+ * @desc Create unique type that can't be assigned to base type by accident.
95
+ */
96
+ type Opaque<T, N extends string> = T & {
97
+ __type: N;
98
+ }
@@ -1,4 +1,4 @@
1
- import {Builtin, Type} from './common';
1
+ import {Builtin} from './common';
2
2
  import {IfClass, IfTuple} from './type-check';
3
3
  import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
4
4
 
@@ -8,100 +8,159 @@ import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from '
8
8
  export type DeepPickOptional<T> = _DeepPickOptional<T>;
9
9
  type _DeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
10
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>> };
11
+ : IfTuple<T> extends true ? T
12
+ : IfClass<T> extends true ? T
13
+ : T extends Promise<infer U> ? Promise<DeepPickOptional<U>>
14
+ : T extends Map<any, any> ? T
15
+ : T extends ReadonlyMap<any, any> ? T
16
+ : T extends WeakMap<any, any> ? T
17
+ : T extends Set<any> ? T
18
+ : T extends ReadonlySet<any> ? T
19
+ : T extends WeakSet<any> ? T
20
+ : T extends any[] ? T
21
+ : { [P in K]?: DeepPickOptional<Exclude<T[P], undefined>> };
21
22
 
22
23
  /**
23
- * Pick all required properties in T deeply
24
+ * Pick all optional properties in T deeply
25
+ */
26
+ export type StrictDeepPickOptional<T> = _StrictDeepPickOptional<T>;
27
+ type _StrictDeepPickOptional<T, K extends keyof T = OptionalKeys<T>> =
28
+ T extends Builtin ? T
29
+ : IfTuple<T> extends true ? T
30
+ : IfClass<T> extends true ? T
31
+ : T extends Promise<infer U> ? Promise<StrictDeepPickOptional<U>>
32
+ : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickOptional<V>>
33
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickOptional<V>>
34
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickOptional<V>>
35
+ : T extends Set<infer U> ? Set<StrictDeepPickOptional<U>>
36
+ : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickOptional<U>>
37
+ : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickOptional<U>>
38
+ : T extends (infer U)[] ? StrictDeepPickOptional<U>[]
39
+ : { [P in K]?: StrictDeepPickOptional<Exclude<T[P], undefined>> };
40
+
41
+ /**
42
+ * Pick all required properties in T deeply even in Maps, Sets etc
24
43
  */
25
44
  export type DeepPickRequired<T> = _DeepPickRequired<T>;
26
45
  type _DeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
27
46
  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>> };
47
+ : IfTuple<T> extends true ? T
48
+ : IfClass<T> extends true ? T
49
+ : T extends Promise<infer U> ? Promise<DeepPickRequired<U>>
50
+ : T extends Map<any, any> ? T
51
+ : T extends ReadonlyMap<any, any> ? T
52
+ : T extends WeakMap<any, any> ? T
53
+ : T extends Set<any> ? T
54
+ : T extends ReadonlySet<any> ? T
55
+ : T extends WeakSet<any> ? T
56
+ : T extends any[] ? T
57
+ : { [P in J]-?: DeepPickRequired<Exclude<T[P], undefined>> };
58
+
59
+ /**
60
+ * Pick all required properties in T deeply even in Maps, Sets etc
61
+ */
62
+ export type StrictDeepPickRequired<T> = _StrictDeepPickRequired<T>;
63
+ type _StrictDeepPickRequired<T, J extends keyof T = RequiredKeys<T>> =
64
+ T extends Builtin ? T
65
+ : IfTuple<T> extends true ? T
66
+ : IfClass<T> extends true ? T
67
+ : T extends Promise<infer U> ? Promise<StrictDeepPickRequired<U>>
68
+ : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickRequired<V>>
69
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickRequired<V>>
70
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickRequired<V>>
71
+ : T extends Set<infer U> ? Set<StrictDeepPickRequired<U>>
72
+ : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickRequired<U>>
73
+ : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickRequired<U>>
74
+ : T extends (infer U)[] ? StrictDeepPickRequired<U>[]
75
+ : { [P in J]-?: StrictDeepPickRequired<Exclude<T[P], undefined>> };
76
+
38
77
 
39
78
  /**
40
79
  * Pick all readonly properties in T deeply
41
80
  */
42
81
  export type DeepPickReadonly<T> = _DeepPickReadonly<T>;
43
- type _DeepPickReadonly<T, J extends keyof T = ReadonlyKeys<T>> =
82
+ type _DeepPickReadonly<T, K extends keyof T = ReadonlyKeys<T>> =
44
83
  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>> };
84
+ : IfTuple<T> extends true ? T
85
+ : IfClass<T> extends true ? T
86
+ : T extends Promise<infer U> ? Promise<DeepPickReadonly<U>>
87
+ : T extends Map<any, any> ? T
88
+ : T extends ReadonlyMap<any, any> ? T
89
+ : T extends WeakMap<any, any> ? T
90
+ : T extends Set<any> ? T
91
+ : T extends ReadonlySet<any> ? T
92
+ : T extends WeakSet<any> ? T
93
+ : T extends any[] ? T
94
+ : { [P in K]: DeepPickReadonly<Exclude<T[P], undefined>> };
95
+
96
+ /**
97
+ * Pick all readonly properties in T deeply even in Maps, Sets etc
98
+ */
99
+ export type StrictDeepPickReadonly<T> = _StrictDeepPickReadonly<T>;
100
+ type _StrictDeepPickReadonly<T, J extends keyof T = ReadonlyKeys<T>> =
101
+ T extends Builtin ? T
102
+ // : IfTuple<T> extends true ? T
103
+ // : IfClass<T> extends true ? T
104
+ : T extends Promise<infer U> ? Promise<StrictDeepPickReadonly<U>>
105
+ : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickReadonly<V>>
106
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickReadonly<V>>
107
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickReadonly<V>>
108
+ : T extends Set<infer U> ? Set<StrictDeepPickReadonly<U>>
109
+ : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickReadonly<U>>
110
+ : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickReadonly<U>>
111
+ : T extends (infer U)[] ? StrictDeepPickReadonly<U>[]
112
+ : { [P in J]: StrictDeepPickReadonly<Exclude<T[P], undefined>> };
55
113
 
56
114
  /**
57
115
  * Pick all writable properties in T deeply
58
116
  */
59
- export type DeepPickWritable<T> = _DeepPickWritable<T>
117
+ export type DeepPickWritable<T> = _DeepPickWritable<T>;
60
118
  type _DeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
61
119
  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
- : IfClass<T> extends true ? DeepPickWritable<Type<T>>
71
- : T extends (infer U)[] ? DeepPickWritable<U>[]
72
- : { [P in K]: DeepPickWritable<Exclude<T[P], undefined>> }
120
+ : IfTuple<T> extends true ? T
121
+ : IfClass<T> extends true ? T
122
+ : T extends Promise<infer U> ? Promise<DeepPickWritable<U>>
123
+ : T extends Map<any, any> ? T
124
+ : T extends ReadonlyMap<any, any> ? T
125
+ : T extends WeakMap<any, any> ? T
126
+ : T extends Set<any> ? T
127
+ : T extends ReadonlySet<any> ? T
128
+ : T extends WeakSet<any> ? T
129
+ : T extends any[] ? T
130
+ : { [P in K]: DeepPickWritable<Exclude<T[P], undefined>> };
73
131
 
74
132
  /**
75
- * Pick all JSON friendly properties in T deeply
133
+ * Pick all writable properties in T deeply even in Maps, Sets etc
76
134
  */
77
- export type DeepPickJson<T> = _DeepPickJson<T>
78
- type _DeepPickJson<T, Keys extends keyof T = JsonKeys<T>> =
135
+ export type StrictDeepPickWritable<T> = _StrictDeepPickWritable<T>
136
+ type _StrictDeepPickWritable<T, K extends keyof T = WritableKeys<T>> =
79
137
  T extends Builtin ? T
80
- : T extends Promise<infer U> ? Promise<DeepPickJson<U>>
81
- : T extends Map<infer K, infer V> ? Map<K, DeepPickJson<V>>
82
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickJson<V>>
83
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickJson<V>>
84
- : T extends Set<infer U> ? Set<DeepPickJson<U>>
85
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickJson<U>>
86
- : T extends WeakSet<infer U> ? WeakSet<DeepPickJson<U>>
87
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickJson<T[K]> }
88
- : T extends (infer U)[] ? DeepPickJson<U>[]
89
- : { [P in Keys]: DeepPickJson<Exclude<T[P], undefined>> };
90
-
138
+ : IfTuple<T> extends true ? T
139
+ : IfClass<T> extends true ? T
140
+ : T extends Promise<infer U> ? Promise<StrictDeepPickWritable<U>>
141
+ : T extends Map<infer K, infer V> ? Map<K, StrictDeepPickWritable<V>>
142
+ : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, StrictDeepPickWritable<V>>
143
+ : T extends WeakMap<infer K, infer V> ? WeakMap<K, StrictDeepPickWritable<V>>
144
+ : T extends Set<infer U> ? Set<StrictDeepPickWritable<U>>
145
+ : T extends ReadonlySet<infer U> ? ReadonlySet<StrictDeepPickWritable<U>>
146
+ : T extends WeakSet<infer U> ? WeakSet<StrictDeepPickWritable<U>>
147
+ : T extends (infer U)[] ? StrictDeepPickWritable<U>[]
148
+ : { -readonly [P in K]: StrictDeepPickWritable<Exclude<T[P], undefined>> }
91
149
 
92
150
  /**
93
151
  * Pick all JSON friendly properties in T deeply
94
152
  */
95
- export type DeepPickWritableJson<T> = _DeepPickWritableJson<T>
96
- type _DeepPickWritableJson<T, Keys extends keyof T = Exclude<JsonKeys<T>, ReadonlyKeys<T>>> =
153
+ export type DeepPickJson<T> = _DeepPickJson<T>
154
+ type _DeepPickJson<T, Keys extends keyof T = JsonKeys<T>> =
97
155
  T extends Builtin ? T
98
- : T extends Promise<infer U> ? Promise<DeepPickWritableJson<U>>
99
- : T extends Map<infer K, infer V> ? Map<K, DeepPickWritableJson<V>>
100
- : T extends ReadonlyMap<infer K, infer V> ? ReadonlyMap<K, DeepPickWritableJson<V>>
101
- : T extends WeakMap<infer K, infer V> ? WeakMap<K, DeepPickWritableJson<V>>
102
- : T extends Set<infer U> ? Set<DeepPickWritableJson<U>>
103
- : T extends ReadonlySet<infer U> ? ReadonlySet<DeepPickWritableJson<U>>
104
- : T extends WeakSet<infer U> ? WeakSet<DeepPickWritableJson<U>>
105
- : IfTuple<T> extends true ? { [K in OptionalKeys<T>]?: DeepPickWritableJson<T[K]> }
106
- : T extends (infer U)[] ? DeepPickWritableJson<U>[]
107
- : { [P in Keys]: DeepPickWritableJson<Exclude<T[P], undefined>> };
156
+ : IfTuple<T> extends true ? T
157
+ : IfClass<T> extends true ? T
158
+ : T extends Promise<infer U> ? Promise<DeepPickJson<U>>
159
+ : T extends Map<any, any> ? T
160
+ : T extends ReadonlyMap<any, any> ? T
161
+ : T extends WeakMap<any, any> ? T
162
+ : T extends Set<any> ? T
163
+ : T extends ReadonlySet<any> ? T
164
+ : T extends WeakSet<any> ? T
165
+ : T extends any[] ? T
166
+ : { [P in Keys]: DeepPickJson<Exclude<T[P], undefined>> };
package/lib/modify.d.ts CHANGED
@@ -2,10 +2,30 @@
2
2
  * Make all properties in T writable
3
3
  */
4
4
  export type Writable<T> = {
5
- -readonly [P in keyof T]: T[P];
5
+ -readonly [P in keyof T]: T[P];
6
6
  };
7
7
 
8
8
  /**
9
9
  * Combination of Partial and Writable
10
10
  */
11
11
  export type Buildable<T> = Partial<Writable<T>>;
12
+
13
+ /**
14
+ * Marks given keys as optional
15
+ */
16
+ export type PartialSome<T, K extends keyof T> = Partial<Pick<T, K>> & Omit<T, K>;
17
+
18
+ /**
19
+ * Marks given keys as required
20
+ */
21
+ export type RequiredSome<T, K extends keyof T> = Required<Pick<T, K>> & Omit<T, K>;
22
+
23
+ /**
24
+ * Marks given keys as readonly
25
+ */
26
+ export type ReadonlySome<T, K extends keyof T> = Readonly<Pick<T, K>> & Omit<T, K>;
27
+
28
+ /**
29
+ * Marks given keys as writable
30
+ */
31
+ export type WritableSome<T, K extends keyof T> = Writable<Pick<T, K>> & Omit<T, K>;
package/lib/omit.d.ts CHANGED
@@ -1,5 +1,7 @@
1
1
  import {JsonKeys, OptionalKeys, ReadonlyKeys, RequiredKeys, WritableKeys} from './keys';
2
2
 
3
+ export type StrictOmit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>;
4
+
3
5
  /**
4
6
  * Omit all optional properties in T
5
7
  */
@@ -115,7 +115,7 @@ export type IfFunctionOrAny<T, Y = true, N = false> =
115
115
  IfAny<T> extends true ? Y : IfFunction<T, Y, N>;
116
116
 
117
117
  /**
118
- * Returns Y if typeof T is an empty object, N otherwise
118
+ * Returns Y if typeof T is a constructor type, N otherwise
119
119
  */
120
120
  export type IfClass<T, Y = true, N = false> =
121
121
  IfNever<T> extends true ? N
@@ -131,8 +131,15 @@ export type IfClassOrAny<T, Y = true, N = false> =
131
131
  /**
132
132
  * Returns "Y" if "T1" is exactly same with "T2", "N" otherwise
133
133
  */
134
- type IfEquals<T1, T2, Y = true, N = false> =
135
- (<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? Y : N;
134
+ type EqualsWrapped<T> = T extends infer R & {}
135
+ ? {
136
+ [P in keyof R]: R[P]
137
+ }
138
+ : never
139
+ export type IfEquals<T1, T2, Y = true, N = false> =
140
+ IfObject<T1> | IfObject<T2> extends true
141
+ ? ((<G>() => G extends EqualsWrapped<T1> ? 1 : 2) extends (<G>() => G extends EqualsWrapped<T2> ? 1 : 2) ? Y : N)
142
+ : ((<G>() => G extends T1 ? 1 : 2) extends (<G>() => G extends T2 ? 1 : 2) ? Y : N);
136
143
 
137
144
  /**
138
145
  * Returns "Y" if type "T" matches "U", "N" otherwise
package/package.json CHANGED
@@ -12,7 +12,7 @@
12
12
  "lodash",
13
13
  "underscore"
14
14
  ],
15
- "version": "1.5.2",
15
+ "version": "2.2.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>",
@@ -33,10 +33,10 @@
33
33
  "typescript": ">=4.0.0"
34
34
  },
35
35
  "devDependencies": {
36
- "@types/jest": "^27.4.0",
37
- "jest": "^27.4.7",
38
- "prettier": "^2.5.1",
39
- "ts-jest": "^27.1.3",
40
- "typescript": "^4.5.5"
36
+ "@types/jest": "^28.1.4",
37
+ "eslint": "^8.19.0",
38
+ "jest": "^28.1.2",
39
+ "ts-jest": "^28.0.5",
40
+ "typescript": "^4.7.4"
41
41
  }
42
42
  }