Skip to content

Instantly share code, notes, and snippets.

@turbotobias
Last active March 23, 2023 01:48
Show Gist options
  • Save turbotobias/8fb8c324a63beb4bcfc66e30e42892a4 to your computer and use it in GitHub Desktop.
Save turbotobias/8fb8c324a63beb4bcfc66e30e42892a4 to your computer and use it in GitHub Desktop.
Rust Result in Typescript
export type Result<T, E = undefined> = { ok: true; value: T } | { ok: false; error: E | undefined }
export const Ok = <T>(data: T): Result<T, never> => ({ ok: true, value: data })
export const Err = <E>(error?: E): Result<never, E> => ({ ok: false, error })
import { type Result, Ok, Err } from "./@result"
const truthy = (arg?: any) => (!!arg ? Ok(arg) : Err(`falsy`))
const truth = truthy("something")
truth.ok ? console.log(`truthy`) : truth.error ? console.trace(`falsy ${truth.error}`) : console.trace(`unknown error`)
import { type Result, Ok, Err } from "./@result"
const numberIsLessThan10 = (num: number): Result<number, string> => {
if (num < 10) return Ok(num)
return Err("number is not less than 10")
}
const number = numberIsLessThan10(5)
if (number.ok) useNumber(number.value) // valid
else if (number.error) console.trace(number.error) // invalid with known error
else console.trace("unknown error") // invalid with unknown error
import { type Result, Ok, Err } from "./@result"
const fetchGeoJson = async (): Promise<Result<GeoJson, string>> => {
const res = await fetch(`/api`)
const json = await res.json()
if (!json) return Err("could not get json from api")
if (!validate(json.geo)) return Err("did not get valid geo json from api")
return Ok(json.geo)
}
const geoJson = await fetchGeoJson()
if (geoJson.ok) useGeoJson(geoJson.value) // valid
else if (geoJson.error) console.trace(geoJson.error) // invalid with known error
else console.trace("unknown error") // invalid with unknown error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment