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
/** made by Dan Imhoff, the code below is copy-pasted from https://www.huy.rocks/everyday/02-14-2022-typescript-implement-rust-style-result */
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 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) // ok
else if (number.error) console.trace(number.error) // known error
else console.trace("unknown error") // unknown error
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) // ok
else if (geoJson.error) console.trace(geoJson.error) // known error
else console.trace("unknown error") // unknown error
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment