Show HN: Voft – VAVR‑style objects for Typscript

4 months ago 10

Various Objects For Typescript

voft is a library that provides various objects and utilities for TypeScript, allowing you to write more declarative and functional code.

Right now, the library includes the following classes:

  • Try: A class that allows you to chain synchronous functions and handle errors in a more declarative way.
  • AsyncTry: A class that allows you to chain asynchronous functions and handle errors in a more declarative way.
  • Optional: A class that allows you to convey the presence or absence of a value in a more declarative way.
  • Either: A class that allows you to convey a success or failure in a more declarative way.

You can find more information about each class in the docs.

You can find examples of how to use the classes in the examples directory.

import { AsyncTry } from '../src'; interface Launch { rocket: string; } interface Rocket { name: string; } async function getLatestLaunch(): Promise<Launch> { const response = await fetch('https://api.spacexdata.com/v5/launches/latest'); return response.json(); } async function getRocket(rocketIdentifier: string): Promise<Rocket> { const response = await fetch( `https://api.spacexdata.com/v4/rockets/${rocketIdentifier}` ); return response.json(); } export function printRocketNameOfLatestLaunch(): AsyncTry<string> { return AsyncTry.of(getLatestLaunch) .andThen(() => console.log('Got the latest launch!')) .map((launch) => launch.rocket) .andThen((rocketId: string) => console.log(`Got the rocket id: ${rocketId}`) ) .map(getRocket) .andThen(() => console.log('Got the rocket!')) .map((rocket: Rocket) => rocket.name) .andThen((rocketName: string) => console.log(`The rocket name is: ${rocketName}`) ); }

This builds to /dist. Test files and examples are not included.

This runs the tests in all /test directories.

This runs the tests and generates a coverage report. The tests will fail if the coverage is below 100% for all files.

This runs the linter on all files in the /src directory.

This generates documentation based on the JSDoc to the /docs directory.

Read Entire Article