ts-toolbelt vs fp-ts vs neverthrow vs ts-results
Functional Programming Libraries in TypeScript Comparison
1 Year
ts-toolbeltfp-tsneverthrowts-resultsSimilar Packages:
What's Functional Programming Libraries in TypeScript?

These libraries provide tools and abstractions for functional programming in TypeScript, enabling developers to write more predictable, maintainable, and type-safe code. They focus on handling errors, managing data transformations, and enhancing code clarity through functional paradigms. Each library offers unique features that cater to different needs in functional programming, making it essential to understand their specific functionalities and use cases.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
ts-toolbelt3,792,0476,944-724 years agoApache-2.0
fp-ts2,913,80411,1164.74 MB19121 days agoMIT
neverthrow780,8275,431112 kB553 months agoMIT
ts-results98,7941,279-404 years agoMIT
Feature Comparison: ts-toolbelt vs fp-ts vs neverthrow vs ts-results

Error Handling

  • ts-toolbelt:

    ts-toolbelt does not focus on error handling directly but provides utility types that can help enhance error handling patterns in TypeScript, allowing for more expressive and type-safe code.

  • fp-ts:

    fp-ts offers a rich set of data types for error handling, including Either and TaskEither, which allow you to represent computations that can fail. This enables you to chain operations while gracefully handling errors without relying on exceptions.

  • neverthrow:

    neverthrow provides a simple Result type that encapsulates success and failure states. It allows you to handle errors in a functional way, promoting a clear separation between successful and erroneous outcomes without the need for try-catch blocks.

  • ts-results:

    ts-results introduces a Result type that simplifies error handling by explicitly representing success and failure. This encourages developers to handle errors at the call site, improving code readability and maintainability.

Type Safety

  • ts-toolbelt:

    ts-toolbelt enhances TypeScript's type system with advanced types, allowing developers to create more type-safe applications. It provides utility types that help enforce type constraints and improve type inference.

  • fp-ts:

    fp-ts leverages TypeScript's type system to provide strong type safety across its functional constructs. This ensures that operations are type-checked at compile time, reducing runtime errors and improving code reliability.

  • neverthrow:

    neverthrow emphasizes type safety by ensuring that the Result type is used consistently, preventing common pitfalls associated with error handling in JavaScript. It enforces a clear contract for functions that can fail, enhancing type safety.

  • ts-results:

    ts-results promotes type safety by using a Result type that clearly defines success and failure states. This helps developers avoid unexpected runtime errors related to unhandled cases.

Learning Curve

  • ts-toolbelt:

    ts-toolbelt may require some time to learn due to its extensive set of utility types and advanced TypeScript features. However, once understood, it significantly enhances the developer experience in TypeScript.

  • fp-ts:

    fp-ts has a steeper learning curve due to its comprehensive set of functional programming concepts and abstractions. Developers may need to familiarize themselves with Monads, Functors, and other functional paradigms to fully utilize the library.

  • neverthrow:

    neverthrow is relatively easy to learn, especially for developers already familiar with functional programming concepts. Its API is straightforward, focusing primarily on error handling, making it accessible for new users.

  • ts-results:

    ts-results has a gentle learning curve, as it provides a simple API for handling success and failure states. Developers can quickly grasp its usage without extensive knowledge of functional programming.

Use Cases

  • ts-toolbelt:

    ts-toolbelt is useful for any TypeScript project that requires advanced type manipulations and utility types. It enhances the development experience by providing powerful tools to work with TypeScript's type system.

  • fp-ts:

    fp-ts is well-suited for complex applications that require advanced functional programming techniques, such as data transformations, asynchronous operations, and robust error handling. It is ideal for projects that prioritize maintainability and type safety.

  • neverthrow:

    neverthrow is perfect for applications where error handling is critical, such as APIs and user input validation. It provides a clear and concise way to manage errors without complicating the codebase.

  • ts-results:

    ts-results is great for applications that need a straightforward way to handle operations that can succeed or fail, such as database queries or network requests. It simplifies the process of managing outcomes and promotes better error handling practices.

Community and Ecosystem

  • ts-toolbelt:

    ts-toolbelt has a vibrant community and is frequently updated with new features. Its utility types are widely used in the TypeScript community, making it a valuable addition to any TypeScript project.

  • fp-ts:

    fp-ts has a growing community and a rich ecosystem of resources, including documentation, tutorials, and community support. It is widely adopted in the functional programming community, making it a reliable choice for developers.

  • neverthrow:

    neverthrow has a smaller but dedicated community focused on functional error handling in TypeScript. It is gaining traction due to its simplicity and effectiveness, with increasing resources available for learning.

  • ts-results:

    ts-results has a modest community, but it is appreciated for its straightforward approach to error handling. As it gains popularity, more resources and examples are becoming available.

How to Choose: ts-toolbelt vs fp-ts vs neverthrow vs ts-results
  • ts-toolbelt:

    Use ts-toolbelt if you are looking for a utility library that enhances TypeScript's type system with advanced types and utility types. It is beneficial for developers who want to leverage TypeScript's capabilities to create more robust and type-safe applications.

  • fp-ts:

    Choose fp-ts if you want a comprehensive library that provides a wide range of functional programming constructs, including Monads, Functors, and more. It is ideal for projects that require advanced functional programming techniques and type safety.

  • neverthrow:

    Select neverthrow if you need a simple and effective way to handle errors in a functional style without throwing exceptions. It is particularly useful for applications where error handling is crucial, and you want to avoid the complexity of traditional error handling mechanisms.

  • ts-results:

    Opt for ts-results if you prefer a straightforward approach to handling success and failure states in your applications. It provides a Result type that makes it easy to work with operations that can succeed or fail, promoting better error handling practices.

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