ts-toolbelt vs ts-essentials vs ts-extras
TypeScript Utility Libraries Comparison
1 Year
ts-toolbeltts-essentialsts-extras
What's TypeScript Utility Libraries?

TypeScript utility libraries provide a collection of types and functions that enhance the TypeScript development experience by offering additional type safety, utility types, and helper functions. These libraries aim to simplify common tasks and improve code quality, making it easier for developers to work with TypeScript's static typing system. Each library has its own unique features and design philosophies, catering to different needs in TypeScript development.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
ts-toolbelt3,581,3626,943-724 years agoApache-2.0
ts-essentials2,638,3013,913231 kB244 months agoMIT
ts-extras15,68261025.7 kB18a month agoMIT
Feature Comparison: ts-toolbelt vs ts-essentials vs ts-extras

Utility Types

  • ts-toolbelt:

    ts-toolbelt is known for its extensive collection of utility types, including advanced features like 'Tuple', 'Object', and 'Function' manipulations. It provides a rich set of types that can handle complex scenarios, making it a go-to choice for developers who need powerful type utilities.

  • ts-essentials:

    ts-essentials provides a set of essential utility types that enhance TypeScript's built-in types. It includes types like 'Nullable', 'Optional', and 'Readonly', which help in creating more expressive and type-safe code without overwhelming the developer with too many options.

  • ts-extras:

    ts-extras offers a broader range of utility types, including advanced types for manipulating tuples, objects, and unions. It provides types like 'Merge', 'PickBy', and 'Omit', which allow for more complex type transformations and help in creating cleaner and more maintainable code.

Functionality

  • ts-toolbelt:

    ts-toolbelt offers a rich set of functions that support advanced programming paradigms, including functional programming techniques. It provides utilities for composing functions, currying, and more, making it suitable for developers who want to leverage TypeScript's capabilities to the fullest.

  • ts-essentials:

    ts-essentials focuses on providing simple and essential functions that enhance TypeScript's capabilities. It includes utility functions for array manipulation, object handling, and type checking, making it easy to perform common tasks without adding unnecessary complexity.

  • ts-extras:

    ts-extras includes a wider range of utility functions that cater to various needs, such as deep cloning, merging objects, and more. It aims to provide a comprehensive toolkit for developers who require additional functionality beyond the basics.

Learning Curve

  • ts-toolbelt:

    ts-toolbelt has a steeper learning curve due to its extensive features and advanced type manipulations. It is best suited for experienced TypeScript developers who are comfortable with complex type systems and functional programming concepts.

  • ts-essentials:

    ts-essentials has a gentle learning curve, making it accessible for developers who are new to TypeScript. Its straightforward API and focus on essential utilities allow for quick adoption without overwhelming users with complexity.

  • ts-extras:

    ts-extras has a moderate learning curve, as it introduces more advanced concepts and utilities. Developers may need to familiarize themselves with additional types and functions, but it remains approachable for those with some TypeScript experience.

Extensibility

  • ts-toolbelt:

    ts-toolbelt is highly extensible, providing a robust framework for developers to create custom types and utilities. Its comprehensive API allows for extensive customization, making it suitable for large-scale applications that require tailored solutions.

  • ts-essentials:

    ts-essentials is designed to be lightweight and minimal, which makes it less extensible compared to other libraries. However, its simplicity allows developers to easily integrate it into existing projects without significant overhead.

  • ts-extras:

    ts-extras offers moderate extensibility, allowing developers to build upon its utility types and functions. It provides a solid foundation for creating custom utilities while maintaining a balance between simplicity and functionality.

Community Support

  • ts-toolbelt:

    ts-toolbelt boasts a strong community and extensive documentation, providing ample resources for developers. Its popularity among advanced TypeScript users ensures that there are plenty of examples, tutorials, and discussions available.

  • ts-essentials:

    ts-essentials has a smaller community compared to the other libraries, which may result in limited resources and examples. However, its simplicity and focus on essentials make it easy to understand and use without extensive community support.

  • ts-extras:

    ts-extras has a growing community and offers a decent amount of resources, including documentation and examples. This makes it easier for developers to find help and learn from others who have used the library.

How to Choose: ts-toolbelt vs ts-essentials vs ts-extras
  • ts-toolbelt:

    Choose ts-toolbelt if you need a comprehensive and powerful collection of utility types and functions that cover a wide range of use cases. It is designed for advanced TypeScript users who require extensive type manipulation capabilities and want to leverage TypeScript's full potential.

  • ts-essentials:

    Choose ts-essentials if you need a lightweight library that offers essential utility types and functions to enhance TypeScript's type system without adding unnecessary complexity. It is ideal for projects that require basic type utilities and want to keep dependencies minimal.

  • ts-extras:

    Choose ts-extras if you are looking for a more extensive set of utility types and functions that go beyond the basics. This library provides additional features that can help with more complex type manipulations and improve overall code quality, making it suitable for larger projects.

README for ts-toolbelt

banner

TypeScript's largest utility library

Language grade: JavaScript

📖 Documentation · 📣 Announcements · 🐞 Report Bug · 🍩 Request Feature · 🤔 Ask Questions

About

ts-toolbelt is the largest, and most tested type library available right now, featuring +200 utilities. Our type collection packages some of the most advanced mapped types, conditional types, and recursive types on the market.

Spend less time, build stronger. Benefit from a wide range of generic type functions to achieve better type safety.

We work just like lodash, or ramda, but applied to the type system. Our mission is to provide you with simple ways to compute, change, and create types. We abstract all those complex type checks away for you. We provide a simple, reusable, and standard API to help you get more done with TypeScript.

ts-toolbelt is a well organized package that can help you perform advanced operations on object types, union types, as well as function, and literal types. It is carefully and coherently designed for building robust, flexible, and type-safe software.

demo

We are a community and a knowledge base. Everyone is welcome to ask questions about types. If you are stuck or you misunderstand something, you came to the right place!. We welcome beginners and advanced developers to come take part. Welcome!

Getting Started

Prerequisites

npm install typescript@^4.1.0 --save-dev

For best results, add this to your tsconfig.json

{
  "compilerOptions": {
    // highly recommended (required by few utilities)
    "strictNullChecks": true,

    // this is optional, but enable whenever possible
    "strict": true,

    // this is the lowest supported standard library
    "lib": ["es2015"],
  }
}

Installation

npm install ts-toolbelt --save

Hello World

import {Object} from "ts-toolbelt"
// Check the docs below for more

// Merge two `object` together
type merge = Object.Merge<{name: string}, {age?: number}>
// {name: string, age?: number}

// Make a field of an `object` optional
type optional = Object.Optional<{id: number, name: string}, "name">
// {id: number, name?: string}

You can level-up, and re-code this library from scratch.

Documentation ⤢

Imports

The project is organized around TypeScript's main concepts:

| Any | Boolean | Class | Function | Iteration | List | |------------|-------------|--------------|--------------|---------------|----------| | Number | Object | Object.P | String | Union | Test |

TIP How to choose categories? Match your type with them.

There are many ways to import the types into your project:

  • Explicit

    import {Any, Boolean, Class, Function, Iteration, List, Number, Object, String, Union} from "ts-toolbelt"
    
  • Compact

    import {A, B, C, F, I, L, N, O, S, U} from "ts-toolbelt"
    
  • Portable

    import tb from "ts-toolbelt"
    

You can also import our non-official API from the community:

import {Community} from "ts-toolbelt"

TIP The community API is for our community to publish useful types that don't see fit in the standard API.

Utility Index

|ANY|OBJECT|LIST|FUNCTION|STRING|UNION|CLASS|BOOLEAN|NUMBER|OBJECT.P|ITERATION| |---|---|---|---|---|---|---|---|---|---|---| |Await|Assign|Append|AutoPath|At|Diff|Class|And|Absolute|Merge|Iteration| |At|AtLeast|Assign|Compose|Join|Exclude|Instance|Not|Add|Omit|IterationOf| |Cast|Compulsory|AtLeast|Curry|Length|Filter|Parameters|Or|Greater|Pick|Key| |Compute|CompulsoryKeys|Compulsory|Exact|Replace|Has||Xor|GreaterEq|Readonly|Next| |Contains|Diff|CompulsoryKeys|Function|Split|IntersectOf|||IsNegative|Update|Pos| |Equals|Either|Concat|Length||Last|||IsPositive|Record|Prev| |Extends|Exclude|Diff|Narrow||Merge|||IsZero||| |Key|ExcludeKeys|Drop|NoInfer||NonNullable|||Lower||| |Keys|Filter|Either|Parameters||Nullable|||LowerEq||| |KnownKeys|FilterKeys|Exclude|Pipe||Pop|||Negate||| |Is|Has|ExcludeKeys|Promisify||Replace|||Range||| |Promise|HasPath|Extract|Return||Select|||Sub||| |Try|Includes|Filter|UnCurry||Strict|||||| |Type|Intersect|FilterKeys|ValidPath||ListOf|||||| |x|IntersectKeys|Flatten||||||||| ||Invert|Group||||||||| ||ListOf|Has||||||||| ||Merge|HasPath||||||||| ||MergeAll|Head||||||||| ||Modify|Includes||||||||| ||NonNullable|Intersect||||||||| ||NonNullableKeys|IntersectKeys||||||||| ||Nullable|KeySet||||||||| ||NullableKeys|Last||||||||| ||Object|LastKey||||||||| ||Omit|Length||||||||| ||Optional|List||||||||| ||OptionalKeys|Longest||||||||| ||Overwrite|Merge||||||||| ||Partial|MergeAll||||||||| ||Patch|Modify||||||||| ||PatchAll|NonNullable||||||||| ||Path|NonNullableKeys||||||||| ||Paths|Nullable||||||||| ||Pick|NullableKeys||||||||| ||Readonly|ObjectOf||||||||| ||ReadonlyKeys|Omit||||||||| ||Record|Optional||||||||| ||Replace|OptionalKeys||||||||| ||Required|Overwrite||||||||| ||RequiredKeys|Partial||||||||| ||Select|Patch||||||||| ||SelectKeys|PatchAll||||||||| ||Undefinable|Path||||||||| ||UndefinableKeys|Paths||||||||| ||Unionize|Pick||||||||| ||UnionOf|Pop||||||||| ||Update|Prepend||||||||| ||Writable|Readonly||||||||| ||WritableKeys|ReadonlyKeys||||||||| |||Remove||||||||| |||Repeat||||||||| |||Replace||||||||| |||Required||||||||| |||RequiredKeys||||||||| |||Reverse||||||||| |||Select||||||||| |||SelectKeys||||||||| |||Shortest||||||||| |||Tail||||||||| |||Take||||||||| |||Undefinable||||||||| |||UndefinableKeys||||||||| |||Unionize||||||||| |||UnionOf||||||||| |||UnNest||||||||| |||Update||||||||| |||Writable||||||||| |||WritableKeys||||||||| |||Zip||||||||| |||ZipObj|||||||||

Archives ⤢

EXAMPLE https://millsp.github.io/ts-toolbelt/4.2.1/

Good to Know ⤢

In this wiki, you will find some extra resources for your learning, and understanding.

Are you missing something? Participate to the open-wiki by posting your questions.

Running tests

For this project

To run the lint & type tests, simply run:

npm test

For your project

Want to test your own types? Let's get started:

import {Number, Test} from "ts-toolbelt"

const {checks, check} = Test

checks([
    check<Number.Add<1, 30>, 31, Test.Pass>(),
    check<Number.Add<5, -3>, 2,  Test.Pass>(),
])

TIP Place it in a file that won't be executed, it's just for TypeScript to test types.

Continuous Integration

The releases are done with Travis CI in stages & whenever a branch or PR is pushed:

  • Tests are run with npm test
  • Tests against DefinitelyTyped
  • Releases to npm@[branch-name]

Compatibility

The project is maintained to adapt to the constant changes of TypeScript:

| ts-toolbelt | typescript | |-------------|------------| | 9.x.x | ^4.1.x |

Major version numbers will upgrade whenever TypeScript had breaking changes.

Otherwise, the release versions will naturally follow the semantic versioning.

What's next

  • Automated performance tests

    # performance is checked manually with 
    npx tsc --noEmit --extendedDiagnostics
    
  • Need to write more examples

Related Projects

| Name | Intro | |----------------------------------------------------------------|------------------------------------------------------------------------------------------| | eledoc | 🌒 A material dark theme for TypeDoc. | | material-candy | 🍬 A vscode theme to uplift your mood, stay happy and focused. | | utility-types | Collection of utility types, complementing TypeScript built-in mapped types and aliases. |

License

FOSSA
Status