Optics Ts

Type-safe, ergonomic, polymorphic optics for TypeScript
Alternatives To Optics Ts
Project NameStarsDownloadsRepos Using ThisPackages Using ThisMost Recent CommitTotal ReleasesLatest ReleaseOpen IssuesLicenseLanguage
Language Ext5,348481544 days ago446June 29, 202250mitC#
C# functional language extensions - a base class library for functional programming
Pyrsistent1,7971,7223583 months ago71January 14, 202218mitPython
Persistent/Immutable/Functional data structures for Python
Robot1,72751412 days ago23May 28, 202229bsd-2-clauseJavaScript
🤖 A functional, immutable Finite State Machine library
List1,638531825 days ago33October 09, 201923mitTypeScript
🐆 An immutable list with unmatched performance and a comprehensive functional API.
Functionaljava1,48823057a year ago18February 11, 202228Java
Functional programming in Java
Monet.js1,44011189a year ago55November 28, 202125mitJavaScript
monet.js - Monadic types library for JavaScript
Omniscient1,19688104 years ago21October 19, 201711JavaScript
A library providing an abstraction for React components that allows for fast top-down rendering embracing immutable data for js
Partial.lenses79193463 years ago180November 06, 201820mitJavaScript
Partial lenses is a comprehensive, high-performance optics library for JavaScript
a day ago1iscKakouneScript
An APL-like programming language. Self-hosted!
Functional Ruby551525 years ago15October 04, 20152otherRuby
A gem for adding functional programming tools to Ruby. Inspired by Erlang, Clojure, Haskell, and Functional Java.
Alternatives To Optics Ts
Select To Compare

Alternative Project Comparisons



optics-ts provides type-safe, ergonomic, polymorphic optics for TypeScript:

  • Optics allow you to read or modify values from deeply nested data structures, while keeping all data immutable.
  • Ergonomic: Optics are composed with method chaining, making it easy and fun!
  • Polymorphic: When writing through the optics, you can change the data types in the nested structure.
  • Type-safe: The compiler will type check all operations you do. No any, ever.



optics-ts supports lenses, prisms, traversals, removing items from containers, and much more!

Since optics-ts v2.2.0, there are two syntaxes for defining optics: method chaining (the default) and standalone optics (experimental). See the docs for more info!

Getting started


npm install optics-ts


yarn add optics-ts

Here's a simple example demonstrating how lenses can be used to drill into a nested data structure:

import * as O from 'optics-ts'

type Book = {
  title: string
  isbn: string
  author: {
    name: string

// Create a lens that focuses on author.name
const optic = O.optic_<Book>().prop('author').prop('name')

// This is the input data
const input: Book = {
  title: "The Hitchhiker's Guide to the Galaxy",
  isbn: '978-0345391803',
  author: {
    name: 'Douglas Adams',

// Read through the optic
// "Douglas Adams"

// Write through the optic
O.set(optic)('Arthur Dent')(input)
// {
//   title: "The Hitchhikers Guide to the Galaxy"
//   isbn: "978-0345391803",
//   author: {
//     name: "Arthur Dent"
//   }
// }

// Update the existing value through the optic, while also changing the data type
O.modify(optic)((str) => str.length + 29)(input)
// {
//   title: "The Hitchhikers Guide to the Galaxy"
//   isbn: "978-0345391803",
//   author: {
//     name: 42
//   }
// }

Another example that converts all words longer than 5 characters to upper case:

import * as O from 'optics-ts/standalone'

const optic = O.optic<string>().words().when(s => s.length >= 5)

const input = 'This is a string with some shorter and some longer words'
O.modify(optic)((s) => s.toUpperCase()(input)
// "This is a STRING with some SHORTER and some LONGER WORDS"

See the documentation for a tutorial and a detailed reference of all supported optics.


Run yarn to install dependencies.

Running the test suite

Run yarn test.

For compiling and running the tests when files change, run these commands in separate terminals:

yarn build:test --watch
yarn jest dist-test/ --watchAll


You need Python 3 to build the docs.

python3 -m venv venv
./venv/bin/pip install mkdocs-material

Run a live reloading server for the documentation:

./venv/bin/mkdocs serve

Open http://localhost:8000/ in the browser.


$ yarn version --new-version <major|minor|patch>
$ yarn publish
$ git push origin main --tags

Open https://github.com/akheron/optics-ts/releases, edit the draft release, select the newest version tag, adjust the description as needed.

Popular Functional Programming Projects
Popular Immutable Projects
Popular Software Development Categories
Related Searches

Get A Weekly Email With Trending Projects For These Categories
No Spam. Unsubscribe easily at any time.
Functional Programming