1 | <p align="center">
|
2 | <img src="/logo.png" width="120" alt="ts-essentials">
|
3 | <h3 align="center">ts-essentials</h3>
|
4 | <p align="center">All essential TypeScript types in one place π€</p>
|
5 | <p align="center">
|
6 | <a href="https://www.npmjs.com/package/ts-essentials" title="View this project on NPM">
|
7 | <img alt="Version" src="https://img.shields.io/npm/v/ts-essentials.svg">
|
8 | </a>
|
9 | <img alt="Downloads" src="https://img.shields.io/npm/dm/ts-essentials.svg">
|
10 | <a href="https://github.com/ts-essentials/ts-essentials/actions?query=branch%3Amaster" title="View Github Build status">
|
11 | <img alt="Build status" src="https://github.com/ts-essentials/ts-essentials/actions/workflows/ci.yml/badge.svg">
|
12 | </a>
|
13 | <a href="https://t.me/ts_essentials" title="Get support in Telegram">
|
14 | <img alt="Telegram" src="https://img.shields.io/badge/-telegram-red?color=white&logo=telegram">
|
15 | </a>
|
16 | <a href="/package.json"><img alt="Software License" src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square"></a>
|
17 | <a href="https://codechecks.io"><img src="https://raw.githubusercontent.com/codechecks/docs/master/images/badges/badge-default.svg?sanitize=true" alt="codechecks.io"></a>
|
18 | </p>
|
19 | </p>
|
20 |
|
21 | ## Install
|
22 |
|
23 | ```sh
|
24 | npm install --save-dev ts-essentials
|
25 | ```
|
26 |
|
27 | π We require `typescript>=4.5`. If you're looking for support for older TS versions, please have a look at the
|
28 | [TypeScript dependency table](https://github.com/ts-essentials/ts-essentials/tree/master#TypeScript-dependency-table)
|
29 |
|
30 | π As we really want types to be stricter, we require enabled
|
31 | [strictNullChecks](https://www.typescriptlang.org/tsconfig#strictNullChecks) in your project
|
32 |
|
33 | ## API
|
34 |
|
35 | `ts-essentials` is a set of high-quality, useful TypeScript types that make writing type-safe code easier.
|
36 |
|
37 | ### Basic
|
38 |
|
39 | - [`Builtin`](/lib/built-in) - Matches primitive, function, date, error or regular expression
|
40 | - [`KeyofBase`](/lib/key-of-base) -
|
41 | [`keyofStringsOnly`](https://www.typescriptlang.org/tsconfig#keyofStringsOnly)-tolerant analogue for `PropertyKey`
|
42 | - [`Prettify<Type>`](/lib/prettify/) - flattens type and makes it more readable on the hover in your IDE
|
43 | - [`Primitive`](/lib/primitive) - Matches any
|
44 | [primitive value](https://developer.mozilla.org/en-US/docs/Glossary/Primitive)
|
45 | - [`StrictExclude<UnionType, ExcludedMembers>`](/lib/strict-exclude) - Constructs a type by excluding from `UnionType`
|
46 | all union members that are assignable to `ExcludedMembers`. This is stricter version of
|
47 | [`Exclude`](https://www.typescriptlang.org/docs/handbook/utility-types.html#excludeuniontype-excludedmembers)
|
48 | - [`StrictExtract<Type, Union>`](/lib/strict-extract) - Constructs a type by extracting from `Type` all union members
|
49 | that are assignable to `Union`. This is stricter version of
|
50 | [`Extract`](https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union)
|
51 | - [`StrictOmit<Type, Keys>`](/lib/strict-omit) - Constructs a type by picking all properties from `Type` and then
|
52 | removing `Keys`. This is stricter version of
|
53 | [`Omit`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys)
|
54 | - [`Writable<Type>`](/lib/writable) - Constructs a type with removed `readonly` for all properties of `Type`, meaning
|
55 | the properties of the constructed type can be reassigned
|
56 |
|
57 | ### Utility types
|
58 |
|
59 | - [`AsyncOrSync<Type>`](/lib/async-or-sync) - Constructs a type with `Type` or `PromiseLike<Type>`
|
60 | - [`AsyncOrSyncType<Type>`](/lib/async-or-sync-type) - Unwraps `AsyncOrSync` type
|
61 | - [`Dictionary<Type, Keys?>`](/lib/dictionary) - Constructs a required object type which property keys are `Keys`
|
62 | (`string` by default) and which property values are `Type`
|
63 | - [`Merge<Object1, Object2>`](/lib/merge) - Constructs a type by picking all properties from `Object1` and `Object2`.
|
64 | Property values from `Object2` override property values from `Object1` when property keys are the same
|
65 | - [`MergeN<Tuple>`](/lib/merge-n) - Constructs a type by merging objects with type `Merge` in tuple `Tuple` recursively
|
66 | - [`Newable<ReturnType>`](/lib/newable) - Constructs a class type with constructor which has return type `ReturnType`
|
67 | - [`NonNever<Type>`](/lib/non-never) - Constructs a type by picking all properties from type `Type` which values don't
|
68 | equal to `never`
|
69 | - [`OmitProperties<Type, Value>`](/lib/omit-properties) - Constructs a type by picking all properties from type `Type`
|
70 | and removing those properties which values equal to `Value`
|
71 | - [`Opaque<Type, Token>`](/lib/opaque) - Constructs a type which is a subset of `Type` with a specified unique token
|
72 | `Token`
|
73 | - [`PathValue<Type, Path>`](/lib/path-value) - Constructs a path value for type `Type` and path `Path`
|
74 | - [`Paths<Type>`](/lib/paths) - Constructs a union type by picking all possible paths for type `Type`
|
75 | - [`PickProperties<Type, Value>`](/lib/pick-properties) - Constructs a type by picking all properties from type `Type`
|
76 | which values equal to `Value`
|
77 | - [`SafeDictionary<Type, Keys?>`](/lib/safe-dictionary) - Constructs an optional object type which property keys are
|
78 | `Keys` (`string` by default) and which property values are `Type`
|
79 | - [`UnionToIntersection<Union>`](/lib/union-to-intersection) - Constructs a intersection type from union type `Union`
|
80 | - [`ValueOf<Type>`](/lib/value-of) - Constructs a type for type `Type` and equals to a primitive for primitives, array
|
81 | elements for arrays, function return type for functions or object property values for objects
|
82 | - [`XOR<Type1, Type2, Type3?, ..., Type50?>`](/lib/xor) - Construct a type which is assignable to either type `Type1`,
|
83 | `Type2` but not both. Starting in ts-essentials@10, it supports up to 50 generic types.
|
84 |
|
85 | ### Mark wrapper types
|
86 |
|
87 | - [`MarkOptional<Type, Keys>`](/lib/mark-optional) - Constructs a type by picking all properties from type `Type` where
|
88 | properties `Keys` are set as optional, meaning they aren't required
|
89 | - [`MarkReadonly<Type, Keys>`](/lib/mark-readonly) - Constructs a type by picking all properties from type `Type` where
|
90 | properties `Keys` are set to `readonly`, meaning they cannot be reassigned
|
91 | - [`MarkRequired<Type, Keys>`](/lib/mark-required) - Constructs a type by picking all properties from type `Type` where
|
92 | properties `Keys` are set as required
|
93 | - [`MarkWritable<Type, Keys>`](/lib/mark-writable) - Constructs a type by picking all properties from type `Type` where
|
94 | properties `Keys` remove `readonly` modifier, meaning they can be reassigned
|
95 |
|
96 | ### Deep wrapper types
|
97 |
|
98 | - [`Buildable<Type>`](/lib/buildable) - Constructs a type by combining `DeepPartial` and `DeepWritable`, meaning all
|
99 | properties from type `Type` are recursively set as non-`readonly` and optional, meaning they can be reassigned and
|
100 | aren't required
|
101 | - [`DeepNonNullable<Type>`](/lib/deep-non-nullable) - Constructs a type by picking all properties from type `Type`
|
102 | recursively and exclude `null` and `undefined` property values from all of them. To make properties non-nullable on
|
103 | one level, use [`NonNullable<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#nonnullabletype)
|
104 | - [`DeepNullable<Type>`](/lib/deep-nullable) - Constructs a type by picking all properties from type `Type` recursively
|
105 | and include `null` property values for all of them
|
106 | - [`DeepOmit<Type, Filter>`](/lib/deep-omit) - Constructs a type by picking all properties from type `Type` and removing
|
107 | properties which values are `never` or `true` in type `Filter`. If you'd like type `Filter` to be validated against a
|
108 | structure of `Type`, please use [`StrictDeepOmit<Type, Filter>`](./lib/strict-deep-omit/).
|
109 | - [`DeepPartial<Type>`](/lib/deep-partial) - Constructs a type by picking all properties from type `Type` recursively
|
110 | and setting them as optional, meaning they aren't required. To make properties optional on one level, use
|
111 | [`Partial<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype)
|
112 | - [`DeepPick<Type, Filter>`](/lib/deep-pick) - Constructs a type by picking set of properties, which have property
|
113 | values `never` or `true` in type `Filter`, from type `Type`. If you'd like type `Filter` to be validated against a
|
114 | structure of `Type`, please use [`StrictDeepPick<Type, Filter>`](./lib/strict-deep-pick/).
|
115 | - [`DeepReadonly<Type>`](/lib/deep-readonly) - Constructs a type by picking all properties from type `Type` recursively
|
116 | and setting `readonly` modifier, meaning they cannot be reassigned. To make properties `readonly` on one level, use
|
117 | [`Readonly<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype)
|
118 | - [`DeepRequired<Type>`](/lib/deep-required) - Constructs a type by picking all properties from type `Type` recursively
|
119 | and setting as required. To make properties required on one level, use
|
120 | [`Required<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype)
|
121 | - [`DeepUndefinable<Type>`](/lib/deep-undefinable) - Constructs a type by picking all properties from type `Type`
|
122 | recursively and include `undefined` property values for all of them
|
123 | - [`DeepWritable<Type>`](/lib/deep-writable) - Constructs a type by picking all properties from type `Type` recursively
|
124 | and removing `readonly` modifier, meaning they can be reassigned. To make properties writable on one level, use
|
125 | `Writable<Type>`
|
126 | - [`StrictDeepOmit<Type, Filter>`](/lib/strict-deep-omit) - Constructs a type by picking all properties from type `Type`
|
127 | and removing properties which values are `never` or `true` in type `Filter`. The type `Filter` is validated against a
|
128 | structure of `Type`.
|
129 | - [`StrictDeepPick<Type, Filter>`](/lib/strict-deep-pick) - Constructs a type by picking set of properties, which have
|
130 | property values `never` or `true` in type `Filter`, from type `Type`. The type `Filter` is validated against a
|
131 | structure of `Type`.
|
132 |
|
133 | ### Key types
|
134 |
|
135 | - [`OptionalKeys<Type>`](/lib/optional-keys) - Constructs a union type by picking all optional properties of object type
|
136 | `Type`
|
137 | - [`PickKeys<Type, Value>`](/lib/pick-keys) - Constructs a union type by picking all properties of object type `Type`
|
138 | which values are assignable to type `Value`
|
139 | - [`ReadonlyKeys<Type>`](/lib/readonly-keys) - Constructs a union type by picking all `readonly` properties of object
|
140 | type `Type`, meaning their values cannot be reassigned
|
141 | - [`RequiredKeys<Type>`](/lib/required-keys) - Constructs a union type by picking all required properties of object type
|
142 | `Type`
|
143 | - [`WritableKeys<Type>`](/lib/writable-keys) - Constructs a union type by picking all writable properties of object type
|
144 | `Type`, meaning their values can be reassigned
|
145 |
|
146 | ### Type checkers
|
147 |
|
148 | - [`Exact<Type, Shape>`](/lib/exact) - Returns `Type` when type `Type` and `Shape` are identical. Otherwise returns
|
149 | `never`
|
150 | - [`IsAny<Type>`](/lib/is-any) - Returns `true` when type `Type` is `any`. Otherwise returns `false`
|
151 | - [`IsNever<Type>`](/lib/is-never) - Returns `true` when type `Type` is `never`. Otherwise returns `false`
|
152 | - [`IsUnknown<Type>`](/lib/is-unknown) - Returns `true` when type `Type` is `unknown`. Otherwise returns `false`
|
153 | - [`IsTuple<Type>`](/lib/is-tuple) - Returns `Type` when type `Type` is tuple. Otherwise returns `never`
|
154 | - [`NonEmptyObject<Object>`](/lib/non-empty-object) - Returns `Object` when `Object` has at least one key. Otherwise
|
155 | returns `never`
|
156 |
|
157 | ### Arrays and Tuples
|
158 |
|
159 | - [`AnyArray<Type?>`](/lib/any-array) - Matches `Array` or `ReadonlyArray` (`Type` is `any` by default)
|
160 | - [`ArrayOrSingle<Type>`](/lib/array-or-single) - Matches `Type` or `Type[]`
|
161 | - [`ElementOf<Type>`](/lib/element-of) - Constructs a type which equals to array element type for type `Type`
|
162 | - [`Head<Type>`](/lib/head) - Constructs a type which equals to first element in type `Type`
|
163 | - [`NonEmptyArray<Type>`](/lib/non-empty-array) - Matches array with at least one element of type `Type`
|
164 | - [`ReadonlyArrayOrSingle`](/lib/readonly-array-or-single) - Matches `Type` or `readonly Type[]`
|
165 | - [`Tail<Type>`](/lib/tail) - Constructs a type which equals to elements but first one in type `Type`
|
166 | - [`Tuple<Type?>`](/lib/tuple) - Matches type constraint for tuple with elements of type `Type` (`any` by default)
|
167 |
|
168 | ### Change case
|
169 |
|
170 | - [`CamelCase<Type>`](/lib/camel-case) - Converts type `Type` to camel case (e.g. `camelCase`)
|
171 | - [`DeepCamelCaseProperties<Type>`](/lib/deep-camel-case-properties) - Constructs a type by picking all properties from
|
172 | type `Type` recursively and converting all of them to camel case
|
173 |
|
174 | ### Function types
|
175 |
|
176 | - [`AnyFunction<Args?, ReturnType?>`](/lib/any-function) - Matches function type with arguments type `Args` (`any[]` by
|
177 | default) and return type `ReturnType` (`any` by default)
|
178 | - [`PredicateFunction`](/lib/predicate-function) - Matches type constraint for type guard, meaning first argument is
|
179 | used in return type and return type is
|
180 | [type predicate](https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates)
|
181 | - [`PredicateType<Type>`](/lib/predicate-type) - Constructs a type which equals to narrowed type in predicate function
|
182 | `Type`
|
183 |
|
184 | ### Utility functions
|
185 |
|
186 | β οΈ Make sure you add `ts-essentials` to your `dependencies` (`npm install --save ts-essentials`) to avoid runtime errors
|
187 |
|
188 | - [`new UnreachableCaseError(value)`](/lib/functions/unreachable-case-error) - Matches runtime class instance type that
|
189 | helps check exhaustiveness for `value`. When `value` isn't `never`, it shows TypeScript error
|
190 | - [`assert(condition, message?)`](/lib/functions/assert) - Matches runtime function that helps assert `condition`. When
|
191 | `condition` is falsy, it throws an error with `Assertion Error: ${message}` (message is
|
192 | `"no additional info provided"` by default)
|
193 | - [`createFactoryWithConstraint<Constraint>()(value)`](/lib/functions/create-factory-with-constraint) - Matches runtime
|
194 | function, which validates that type of `value` matches `Constraint` without changing resulting type of `value`.
|
195 | Ponyfill for
|
196 | [`satisfies` operator](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-4-9.html#the-satisfies-operator)
|
197 | - [`isExact<Expected>()(actual)`](/lib/functions/is-exact) - Matches runtime function, which validates that type of
|
198 | `actual` equals to `Expected`. Otherwise shows TypeScript error
|
199 | - [`noop(..._args)`](/lib/functions/noop) - Matches runtime function that does nothing with arguments `_args`
|
200 |
|
201 | ## Search
|
202 |
|
203 | When one of utility types is known by a different name, kindly ask adding it here for the better search.
|
204 |
|
205 | - `ArrayValues` - [`ValueOf<Type>`](/lib/value-of)
|
206 | - `Branded` - [`Opaque<Type, Token>`](/lib/opaque)
|
207 | - `ConditionalKeys` - [`PickKeys<Type, Value>`](/lib/pick-keys)
|
208 | - `Except` - [`StrictOmit<Type, Keys>`](/lib/strict-omit)
|
209 | - `Get` - [`PathValue<Type, Path>`](/lib/path-value)
|
210 | - `Mutable` - [`Writable<Type>`](/lib/writable)
|
211 | - `Nominal` - [`Opaque<Type, Token>`](/lib/opaque)
|
212 | - `Set*`, e.g. `SetOptional` - `Mark*`, e.g. [`MarkReadonly<Type, Keys>`](/lib/mark-readonly)
|
213 | - `Unwrap` - [`Prettify<Type>`](/lib/prettify/)
|
214 | - `ValueOf` - `DictionaryValues`
|
215 |
|
216 | ## Built-in types
|
217 |
|
218 | TypeScript provides several [utility types](https://www.typescriptlang.org/docs/handbook/utility-types.html) to
|
219 | facilitate common type transformations. These utilities are available globally.
|
220 |
|
221 | - [`Awaited<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#awaitedtype) - This type is meant to
|
222 | model operations like `await` in `async` functions, or the `.then()` method on `Promise`s - specifically, the way that
|
223 | they recursively unwrap `Promise`s
|
224 | - [`Capitalize<StringType>`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#capitalizestringtype) -
|
225 | Converts the first character in the string to an uppercase equivalent
|
226 | - [`ConstructParameters<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#constructorparameterstype) -
|
227 | Constructs a tuple or array type from the types of a constructor function type `Type`
|
228 | - [`Exclude<UnionType, ExcludedMembers>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#excludeuniontype-excludedmembers) -
|
229 | Constructs a type by excluding from `UnionType` all union members that are assignable to `ExcludedMembers`
|
230 | - [`Extract<Type, Union>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#extracttype-union) -
|
231 | Constructs a type by extracting from `Type` all union members that are assignable to `Union`
|
232 | - [`InstanceType<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#instancetypetype) - Constructs
|
233 | a type consisting of the instance type of a constructor function in `Type`
|
234 | - [`Lowercase<StringType>`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#lowercasestringtype) -
|
235 | Converts each character in the string to the lowercase equivalent
|
236 | - [`NonNullable<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#nonnullabletype) - Constructs a
|
237 | type by excluding null and undefined from `Type`
|
238 | - [`Omit<Type, Keys>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#omittype-keys) - Constructs a
|
239 | type by picking all properties from `Type` and then removing `Keys`
|
240 | - [`Parameters<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#parameterstype) - Constructs a
|
241 | tuple type from the types used in the parameters of a function type `Type`
|
242 | - [`Partial<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype) - Constructs a type
|
243 | with all properties of `Type` set to optional
|
244 | - [`Pick<Type, Keys>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#picktype-keys) - Constructs a
|
245 | type by picking the set of properties `Keys` from `Type`
|
246 | - [`Readonly<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#readonlytype) - Constructs a type
|
247 | with all properties of `Type` set to `readonly`, meaning the properties of the constructed type cannot be reassigned
|
248 | - [`Record<Keys, Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#recordkeys-type) - Constructs
|
249 | an object type whose property keys are `Keys` and whose property values are `Type`
|
250 | - [`Required<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#requiredtype) - Constructs a type
|
251 | consisting of all properties of `Type` set to required
|
252 | - [`ReturnType<Type>`](https://www.typescriptlang.org/docs/handbook/utility-types.html#returntypetype) - Constructs a
|
253 | type consisting of the return type of function type `Type` parameter
|
254 | - [`Uncapitalize<StringType>`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#uncapitalizestringtype) -
|
255 | Converts the first character in the string to a lowercase equivalent
|
256 | - [`Uppercase<StringType>`](https://www.typescriptlang.org/docs/handbook/2/template-literal-types.html#uppercasestringtype) -
|
257 | Converts each character in the string to the uppercase version
|
258 |
|
259 | ## TypeScript dependency table
|
260 |
|
261 | | `ts-essentials` | `typescript` / type of dependency |
|
262 | | --------------- | ------------------------------------------------------------------------------------- |
|
263 | | `^10.0.0` | `^4.5.0` / [peer optional](https://github.com/ts-essentials/ts-essentials/issues/370) |
|
264 | | `^9.4.0` | `^4.1.0` / [peer optional](https://github.com/ts-essentials/ts-essentials/issues/370) |
|
265 | | `^8.0.0` | `^4.1.0` / peer |
|
266 | | `^5.0.0` | `^3.7.0` / peer |
|
267 | | `^3.0.1` | `^3.5.0` / peer |
|
268 | | `^1.0.1` | `^3.2.2` / dev |
|
269 | | `^1.0.0` | `^3.0.3` / dev |
|
270 |
|
271 | ## Contributors
|
272 |
|
273 | Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/docs/en/emoji-key)):
|
274 |
|
275 |
|
276 |
|
277 |
|
278 | <table>
|
279 | <tr>
|
280 | <td align="center"><a href="https://twitter.com/krzkaczor"><img src="https://avatars2.githubusercontent.com/u/1814312?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Chris Kaczor</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=krzkaczor" title="Code">π»</a> <a href="#business-krzkaczor" title="Business development">πΌ</a> <a href="#example-krzkaczor" title="Examples">π‘</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=krzkaczor" title="Documentation">π</a></td>
|
281 | <td align="center"><a href="https://scholar.google.com/citations?user=3xZtvpAAAAAJ"><img src="https://avatars3.githubusercontent.com/u/9780746?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Xiao Liang</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=yxliang01" title="Code">π»</a> <a href="#ideas-yxliang01" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=yxliang01" title="Documentation">π</a></td>
|
282 | <td align="center"><a href="https://github.com/Andarist"><img src="https://avatars2.githubusercontent.com/u/9800850?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mateusz BurzyΕski</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=Andarist" title="Code">π»</a> <a href="#ideas-Andarist" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=Andarist" title="Documentation">π</a></td>
|
283 | <td align="center"><a href="https://github.com/macbem"><img src="https://avatars1.githubusercontent.com/u/12464061?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Maciej Bembenista</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=macbem" title="Code">π»</a> <a href="#ideas-macbem" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=macbem" title="Documentation">π</a></td>
|
284 | <td align="center"><a href="https://github.com/MichaelTontchev"><img src="https://avatars0.githubusercontent.com/u/12261336?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Michael Tontchev</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=MichaelTontchev" title="Code">π»</a> <a href="#ideas-MichaelTontchev" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=MichaelTontchev" title="Documentation">π</a></td>
|
285 | <td align="center"><a href="http://ThomasdH.blogspot.com"><img src="https://avatars0.githubusercontent.com/u/3889750?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Thomas den Hollander</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=ThomasdenH" title="Code">π»</a> <a href="#ideas-ThomasdenH" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=ThomasdenH" title="Documentation">π</a></td>
|
286 | <td align="center"><a href="https://twitter.com/esamatti"><img src="https://avatars3.githubusercontent.com/u/225712?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Esa-Matti Suuronen</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=epeli" title="Code">π»</a> <a href="#ideas-epeli" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=epeli" title="Documentation">π</a></td>
|
287 | </tr>
|
288 | <tr>
|
289 | <td align="center"><a href="https://github.com/IlyaSemenov"><img src="https://avatars1.githubusercontent.com/u/128121?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ilya Semenov</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=IlyaSemenov" title="Code">π»</a> <a href="#ideas-IlyaSemenov" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=IlyaSemenov" title="Documentation">π</a></td>
|
290 | <td align="center"><a href="https://codechecks.io"><img src="https://avatars2.githubusercontent.com/u/46399828?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Code Checks</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/pulls?q=is%3Apr+reviewed-by%3Acodechecks" title="Reviewed Pull Requests">π</a></td>
|
291 | <td align="center"><a href="http://www.nomiclabs.io"><img src="https://avatars1.githubusercontent.com/u/176499?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Patricio Palladino</b></sub></a><br /><a href="#ideas-alcuadrado" title="Ideas, Planning, & Feedback">π€</a></td>
|
292 | <td align="center"><a href="http://twitter.com/quezak2"><img src="https://avatars0.githubusercontent.com/u/666206?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Artur Kozak</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=quezak" title="Code">π»</a> <a href="#ideas-quezak" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=quezak" title="Documentation">π</a> <a href="https://github.com/ts-essentials/ts-essentials/pulls?q=is%3Apr+reviewed-by%3Aquezak" title="Reviewed Pull Requests">π</a></td>
|
293 | <td align="center"><a href="https://github.com/lucifer1004"><img src="https://avatars2.githubusercontent.com/u/13583761?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Zihua Wu</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=lucifer1004" title="Code">π»</a> <a href="#ideas-lucifer1004" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=lucifer1004" title="Documentation">π</a></td>
|
294 | <td align="center"><a href="http://kevinpeno.com"><img src="https://avatars1.githubusercontent.com/u/343808?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Kevin Peno</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=kevinpeno" title="Code">π»</a></td>
|
295 | <td align="center"><a href="https://github.com/DomParfitt"><img src="https://avatars2.githubusercontent.com/u/11363907?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dom Parfitt</b></sub></a><br /><a href="#ideas-DomParfitt" title="Ideas, Planning, & Feedback">π€</a></td>
|
296 | </tr>
|
297 | <tr>
|
298 | <td align="center"><a href="https://github.com/EduardoRFS"><img src="https://avatars0.githubusercontent.com/u/3393115?v=4?s=100" width="100px;" alt=""/><br /><sub><b>EduardoRFS</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=EduardoRFS" title="Code">π»</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=EduardoRFS" title="Documentation">π</a></td>
|
299 | <td align="center"><a href="https://andydvorak.net/"><img src="https://avatars1.githubusercontent.com/u/409245?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andrew C. Dvorak</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=acdvorak" title="Documentation">π</a></td>
|
300 | <td align="center"><a href="https://github.com/a1russell"><img src="https://avatars0.githubusercontent.com/u/241628?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Adam Russell</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=a1russell" title="Code">π»</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=a1russell" title="Documentation">π</a></td>
|
301 | <td align="center"><a href="https://github.com/sz-piotr"><img src="https://avatars2.githubusercontent.com/u/17070569?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Piotr Szlachciak</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=sz-piotr" title="Code">π»</a> <a href="#ideas-sz-piotr" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=sz-piotr" title="Documentation">π</a></td>
|
302 | <td align="center"><a href="https://github.com/mikhailswift"><img src="https://avatars3.githubusercontent.com/u/3218582?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Mikhail Swift</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=mikhailswift" title="Code">π»</a></td>
|
303 | <td align="center"><a href="https://github.com/DevilZh"><img src="https://avatars1.githubusercontent.com/u/10295215?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ryan Zhang</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=DevilZh" title="Code">π»</a> <a href="#ideas-DevilZh" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=DevilZh" title="Documentation">π</a></td>
|
304 | <td align="center"><a href="https://www.linkedin.com/in/francesco-borzi/"><img src="https://avatars1.githubusercontent.com/u/75517?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Francesco BorzΓ¬</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=FrancescoBorzi" title="Documentation">π</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=FrancescoBorzi" title="Code">π»</a></td>
|
305 | </tr>
|
306 | <tr>
|
307 | <td align="center"><a href="https://github.com/leaumar"><img src="https://avatars2.githubusercontent.com/u/3950300?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Marnick L'Eau</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=leaumar" title="Code">π»</a> <a href="#ideas-leaumar" title="Ideas, Planning, & Feedback">π€</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=leaumar" title="Documentation">π</a></td>
|
308 | <td align="center"><a href="https://github.com/kubk"><img src="https://avatars1.githubusercontent.com/u/22447849?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kubk</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=kubk" title="Code">π»</a></td>
|
309 | <td align="center"><a href="https://github.com/bbarry"><img src="https://avatars0.githubusercontent.com/u/84951?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bill Barry</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=bbarry" title="Code">π»</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=bbarry" title="Documentation">π</a></td>
|
310 | <td align="center"><a href="https://github.com/akwodkiewicz"><img src="https://avatars2.githubusercontent.com/u/22861194?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Andrzej WΓ³dkiewicz</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=akwodkiewicz" title="Code">π»</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=akwodkiewicz" title="Documentation">π</a> <a href="#ideas-akwodkiewicz" title="Ideas, Planning, & Feedback">π€</a></td>
|
311 | <td align="center"><a href="http://chjdev.com"><img src="https://avatars2.githubusercontent.com/u/973941?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Christian</b></sub></a><br /><a href="#ideas-chjdev" title="Ideas, Planning, & Feedback">π€</a></td>
|
312 | <td align="center"><a href="https://github.com/mattleff"><img src="https://avatars0.githubusercontent.com/u/120155?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Matthew Leffler</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=mattleff" title="Documentation">π</a></td>
|
313 | <td align="center"><a href="https://github.com/studds"><img src="https://avatars2.githubusercontent.com/u/3046407?v=4?s=100" width="100px;" alt=""/><br /><sub><b>studds</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=studds" title="Code">π»</a></td>
|
314 | </tr>
|
315 | <tr>
|
316 | <td align="center"><a href="https://github.com/Beraliv"><img src="https://avatars.githubusercontent.com/u/2991847?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alex Berezin</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=Beraliv" title="Code">π»</a> <a href="https://github.com/ts-essentials/ts-essentials/commits?author=Beraliv" title="Documentation">π</a></td>
|
317 | <td align="center"><a href="https://github.com/vitonsky"><img src="https://avatars.githubusercontent.com/u/86191922?v=4?s=100" width="100px;" alt=""/><br /><sub><b>vitonsky</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=vitonsky" title="Documentation">π</a></td>
|
318 | <td align="center"><a href="https://github.com/itayronen"><img src="https://avatars.githubusercontent.com/u/21139000?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Itay Ronen</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=itayronen" title="Code">π»</a></td>
|
319 | <td align="center"><a href="https://github.com/cyberbiont"><img src="https://avatars.githubusercontent.com/u/59398323?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Yaroslav Larin</b></sub></a><br /><a href="https://github.com/ts-essentials/ts-essentials/commits?author=cyberbiont" title="Code">π»</a></td>
|
320 | </tr>
|
321 | </table>
|
322 |
|
323 |
|
324 |
|
325 |
|
326 |
|
327 |
|
328 | This project follows the [all-contributors](https://github.com/all-contributors/all-contributors) specification.
|
329 | Contributions of any kind welcome! [Read more](./CONTRIBUTING.md)
|