Awesome
<p align="center"> <img src="/logo.png" width="120" alt="ts-essentials"> <h3 align="center">ts-essentials</h3> <p align="center">All essential TypeScript types in one place π€</p> <p align="center"> <a href="https://www.npmjs.com/package/ts-essentials" title="View this project on NPM"> <img alt="Version" src="https://img.shields.io/npm/v/ts-essentials.svg"> </a> <img alt="Downloads" src="https://img.shields.io/npm/dm/ts-essentials.svg"> <a href="https://github.com/ts-essentials/ts-essentials/actions?query=branch%3Amaster" title="View Github Build status"> <img alt="Build status" src="https://github.com/ts-essentials/ts-essentials/actions/workflows/ci.yml/badge.svg"> </a> <a href="https://t.me/ts_essentials" title="Get support in Telegram"> <img alt="Telegram" src="https://img.shields.io/badge/-telegram-red?color=white&logo=telegram"> </a> <a href="/package.json"><img alt="Software License" src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square"></a> <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> </p> </p>Install
npm install --save-dev ts-essentials
π We require typescript>=4.5
. If you're looking for support for older TS versions, please have a look at the
TypeScript dependency table
π As we really want types to be stricter, we require enabled strictNullChecks in your project
API
ts-essentials
is a set of high-quality, useful TypeScript types that make writing type-safe code easier.
Basic
Builtin
- Matches primitive, function, date, error or regular expressionKeyofBase
-keyofStringsOnly
-tolerant analogue forPropertyKey
Prettify<Type>
- flattens type and makes it more readable on the hover in your IDEPrimitive
- Matches any primitive valueStrictExclude<UnionType, ExcludedMembers>
- Constructs a type by excluding fromUnionType
all union members that are assignable toExcludedMembers
. This is stricter version ofExclude
StrictExtract<Type, Union>
- Constructs a type by extracting fromType
all union members that are assignable toUnion
. This is stricter version ofExtract
StrictOmit<Type, Keys>
- Constructs a type by picking all properties fromType
and then removingKeys
. This is stricter version ofOmit
Writable<Type>
- Constructs a type with removedreadonly
for all properties ofType
, meaning the properties of the constructed type can be reassigned
Utility types
AsyncOrSync<Type>
- Constructs a type withType
orPromiseLike<Type>
AsyncOrSyncType<Type>
- UnwrapsAsyncOrSync
typeDictionary<Type, Keys?>
- Constructs a required object type which property keys areKeys
(string
by default) and which property values areType
Merge<Object1, Object2>
- Constructs a type by picking all properties fromObject1
andObject2
. Property values fromObject2
override property values fromObject1
when property keys are the sameMergeN<Tuple>
- Constructs a type by merging objects with typeMerge
in tupleTuple
recursivelyNewable<ReturnType>
- Constructs a class type with constructor which has return typeReturnType
NonNever<Type>
- Constructs a type by picking all properties from typeType
which values don't equal tonever
OmitProperties<Type, Value>
- Constructs a type by picking all properties from typeType
and removing those properties which values equal toValue
Opaque<Type, Token>
- Constructs a type which is a subset ofType
with a specified unique tokenToken
PathValue<Type, Path>
- Constructs a path value for typeType
and pathPath
Paths<Type>
- Constructs a union type by picking all possible paths for typeType
PickProperties<Type, Value>
- Constructs a type by picking all properties from typeType
which values equal toValue
SafeDictionary<Type, Keys?>
- Constructs an optional object type which property keys areKeys
(string
by default) and which property values areType
UnionToIntersection<Union>
- Constructs a intersection type from union typeUnion
ValueOf<Type>
- Constructs a type for typeType
and equals to a primitive for primitives, array elements for arrays, function return type for functions or object property values for objectsXOR<Type1, Type2, Type3?, ..., Type50?>
- Construct a type which is assignable to either typeType1
,Type2
but not both. Starting in ts-essentials@10, it supports up to 50 generic types.
Mark wrapper types
MarkOptional<Type, Keys>
- Constructs a type by picking all properties from typeType
where propertiesKeys
are set as optional, meaning they aren't requiredMarkReadonly<Type, Keys>
- Constructs a type by picking all properties from typeType
where propertiesKeys
are set toreadonly
, meaning they cannot be reassignedMarkRequired<Type, Keys>
- Constructs a type by picking all properties from typeType
where propertiesKeys
are set as requiredMarkWritable<Type, Keys>
- Constructs a type by picking all properties from typeType
where propertiesKeys
removereadonly
modifier, meaning they can be reassigned
Deep wrapper types
Buildable<Type>
- Constructs a type by combiningDeepPartial
andDeepWritable
, meaning all properties from typeType
are recursively set as non-readonly
and optional, meaning they can be reassigned and aren't requiredDeepNonNullable<Type>
- Constructs a type by picking all properties from typeType
recursively and excludenull
andundefined
property values from all of them. To make properties non-nullable on one level, useNonNullable<Type>
DeepNullable<Type>
- Constructs a type by picking all properties from typeType
recursively and includenull
property values for all of themDeepOmit<Type, Filter>
- Constructs a type by picking all properties from typeType
and removing properties which values arenever
ortrue
in typeFilter
. If you'd like typeFilter
to be validated against a structure ofType
, please useStrictDeepOmit<Type, Filter>
.DeepPartial<Type>
- Constructs a type by picking all properties from typeType
recursively and setting them as optional, meaning they aren't required. To make properties optional on one level, usePartial<Type>
DeepPick<Type, Filter>
- Constructs a type by picking set of properties, which have property valuesnever
ortrue
in typeFilter
, from typeType
. If you'd like typeFilter
to be validated against a structure ofType
, please useStrictDeepPick<Type, Filter>
.DeepReadonly<Type>
- Constructs a type by picking all properties from typeType
recursively and settingreadonly
modifier, meaning they cannot be reassigned. To make propertiesreadonly
on one level, useReadonly<Type>
DeepRequired<Type>
- Constructs a type by picking all properties from typeType
recursively and setting as required. To make properties required on one level, useRequired<Type>
DeepUndefinable<Type>
- Constructs a type by picking all properties from typeType
recursively and includeundefined
property values for all of themDeepWritable<Type>
- Constructs a type by picking all properties from typeType
recursively and removingreadonly
modifier, meaning they can be reassigned. To make properties writable on one level, useWritable<Type>
StrictDeepOmit<Type, Filter>
- Constructs a type by picking all properties from typeType
and removing properties which values arenever
ortrue
in typeFilter
. The typeFilter
is validated against a structure ofType
.StrictDeepPick<Type, Filter>
- Constructs a type by picking set of properties, which have property valuesnever
ortrue
in typeFilter
, from typeType
. The typeFilter
is validated against a structure ofType
.
Key types
OptionalKeys<Type>
- Constructs a union type by picking all optional properties of object typeType
PickKeys<Type, Value>
- Constructs a union type by picking all properties of object typeType
which values are assignable to typeValue
ReadonlyKeys<Type>
- Constructs a union type by picking allreadonly
properties of object typeType
, meaning their values cannot be reassignedRequiredKeys<Type>
- Constructs a union type by picking all required properties of object typeType
WritableKeys<Type>
- Constructs a union type by picking all writable properties of object typeType
, meaning their values can be reassigned
Type checkers
Exact<Type, Shape>
- ReturnsType
when typeType
andShape
are identical. Otherwise returnsnever
IsAny<Type>
- Returnstrue
when typeType
isany
. Otherwise returnsfalse
IsNever<Type>
- Returnstrue
when typeType
isnever
. Otherwise returnsfalse
IsUnknown<Type>
- Returnstrue
when typeType
isunknown
. Otherwise returnsfalse
IsTuple<Type>
- ReturnsType
when typeType
is tuple. Otherwise returnsnever
NonEmptyObject<Object>
- ReturnsObject
whenObject
has at least one key. Otherwise returnsnever
Arrays and Tuples
AnyArray<Type?>
- MatchesArray
orReadonlyArray
(Type
isany
by default)ArrayOrSingle<Type>
- MatchesType
orType[]
ElementOf<Type>
- Constructs a type which equals to array element type for typeType
Head<Type>
- Constructs a type which equals to first element in typeType
NonEmptyArray<Type>
- Matches array with at least one element of typeType
ReadonlyArrayOrSingle
- MatchesType
orreadonly Type[]
Tail<Type>
- Constructs a type which equals to elements but first one in typeType
Tuple<Type?>
- Matches type constraint for tuple with elements of typeType
(any
by default)
Change case
CamelCase<Type>
- Converts typeType
to camel case (e.g.camelCase
)DeepCamelCaseProperties<Type>
- Constructs a type by picking all properties from typeType
recursively and converting all of them to camel case
Function types
AnyFunction<Args?, ReturnType?>
- Matches function type with arguments typeArgs
(any[]
by default) and return typeReturnType
(any
by default)PredicateFunction
- Matches type constraint for type guard, meaning first argument is used in return type and return type is type predicatePredicateType<Type>
- Constructs a type which equals to narrowed type in predicate functionType
Utility functions
β οΈ Make sure you add ts-essentials
to your dependencies
(npm install --save ts-essentials
) to avoid runtime errors
new UnreachableCaseError(value)
- Matches runtime class instance type that helps check exhaustiveness forvalue
. Whenvalue
isn'tnever
, it shows TypeScript errorassert(condition, message?)
- Matches runtime function that helps assertcondition
. Whencondition
is falsy, it throws an error withAssertion Error: ${message}
(message is"no additional info provided"
by default)createFactoryWithConstraint<Constraint>()(value)
- Matches runtime function, which validates that type ofvalue
matchesConstraint
without changing resulting type ofvalue
. Ponyfill forsatisfies
operatorisExact<Expected>()(actual)
- Matches runtime function, which validates that type ofactual
equals toExpected
. Otherwise shows TypeScript errornoop(..._args)
- Matches runtime function that does nothing with arguments_args
Search
When one of utility types is known by a different name, kindly ask adding it here for the better search.
ArrayValues
-ValueOf<Type>
Branded
-Opaque<Type, Token>
ConditionalKeys
-PickKeys<Type, Value>
Except
-StrictOmit<Type, Keys>
Get
-PathValue<Type, Path>
Mutable
-Writable<Type>
Nominal
-Opaque<Type, Token>
Set*
, e.g.SetOptional
-Mark*
, e.g.MarkReadonly<Type, Keys>
Unwrap
-Prettify<Type>
ValueOf
-DictionaryValues
Built-in types
TypeScript provides several utility types to facilitate common type transformations. These utilities are available globally.
Awaited<Type>
- This type is meant to model operations likeawait
inasync
functions, or the.then()
method onPromise
s - specifically, the way that they recursively unwrapPromise
sCapitalize<StringType>
- Converts the first character in the string to an uppercase equivalentConstructParameters<Type>
- Constructs a tuple or array type from the types of a constructor function typeType
Exclude<UnionType, ExcludedMembers>
- Constructs a type by excluding fromUnionType
all union members that are assignable toExcludedMembers
Extract<Type, Union>
- Constructs a type by extracting fromType
all union members that are assignable toUnion
InstanceType<Type>
- Constructs a type consisting of the instance type of a constructor function inType
Lowercase<StringType>
- Converts each character in the string to the lowercase equivalentNonNullable<Type>
- Constructs a type by excluding null and undefined fromType
Omit<Type, Keys>
- Constructs a type by picking all properties fromType
and then removingKeys
Parameters<Type>
- Constructs a tuple type from the types used in the parameters of a function typeType
Partial<Type>
- Constructs a type with all properties ofType
set to optionalPick<Type, Keys>
- Constructs a type by picking the set of propertiesKeys
fromType
Readonly<Type>
- Constructs a type with all properties ofType
set toreadonly
, meaning the properties of the constructed type cannot be reassignedRecord<Keys, Type>
- Constructs an object type whose property keys areKeys
and whose property values areType
Required<Type>
- Constructs a type consisting of all properties ofType
set to requiredReturnType<Type>
- Constructs a type consisting of the return type of function typeType
parameterUncapitalize<StringType>
- Converts the first character in the string to a lowercase equivalentUppercase<StringType>
- Converts each character in the string to the uppercase version
TypeScript dependency table
ts-essentials | typescript / type of dependency |
---|---|
^10.0.0 | ^4.5.0 / peer optional |
^9.4.0 | ^4.1.0 / peer optional |
^8.0.0 | ^4.1.0 / peer |
^5.0.0 | ^3.7.0 / peer |
^3.0.1 | ^3.5.0 / peer |
^1.0.1 | ^3.2.2 / dev |
^1.0.0 | ^3.0.3 / dev |
Contributors
Thanks goes to these wonderful people (emoji key):
<!-- ALL-CONTRIBUTORS-LIST:START - Do not remove or modify this section --> <!-- prettier-ignore-start --> <!-- markdownlint-disable --> <table> <tr> <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> <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> <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> <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> <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> <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> <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> </tr> <tr> <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> <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> <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> <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> <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> <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> <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> </tr> <tr> <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> <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> <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> <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> <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> <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> <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> </tr> <tr> <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> <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> <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> <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> <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> <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> <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> </tr> <tr> <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> <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> <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> <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> </tr> </table> <!-- markdownlint-restore --> <!-- prettier-ignore-end --> <!-- ALL-CONTRIBUTORS-LIST:END -->This project follows the all-contributors specification. Contributions of any kind welcome! Read more