
Security News
vlt Launches "reproduce": A New Tool Challenging the Limits of Package Provenance
vlt's new "reproduce" tool verifies npm packages against their source code, outperforming traditional provenance adoption in the JavaScript ecosystem.
@hazae41/option
Advanced tools
Rust-like Option for TypeScript
npm i @hazae41/option
unwrap()
for throwingunwrapOr()
for default valuemap()
for mapping (sync/async)isSome()
/isNone()
type guardsok()
/okOr()
for converting to Result from @hazae41/result
TLDR undefined
is too low level and often leads to ugly and repetitive design patterns or bugs
When designing a function, you often encounter the case where you can't pass undefined
.
function doSomething(text: string) {
return Buffer.from(text, "utf8").toString("base64")
}
function bigFunction(text?: string) {
// ...
doSomething(text) // what if text is undefined?
// ...
}
So you end up checking for undefined
function bigFunction(text?: string) {
// ...
if (text !== undefined) {
doSomething(text)
}
// ...
}
This is annoying if we want to get the returned value
function bigFunction(text?: string) {
// ...
if (text !== undefined) {
const text2 = doSomething(text)
}
// can't use text2
}
Checks become redundant if you need to map the value or throw an error
function bigFunction(text?: string) {
// ...
const text2 = text === undefined
? undefined
: doSomething(text)
// ...
const text3 = text2 === undefined
? undefined
: doSomethingElse(text2)
// ...
if (text3 === undefined)
throw new Error(`something is wrong`)
// use text3
}
Why not check for undefined
in the callee then?
function maybeDoSomething(text?: string) {
if (text === undefined) return
return Buffer.from(text, "utf8").toString("base64")
}
If you know your argument is NOT undefined
, it will force you to check for undefined
after the call
function bigFunction(text: string) {
// ...
const text2 = doSomething(text) // text is never undefined
// text2 can now be undefined
}
Or even worse, force you to use type assertion
function bigFunction(text: string) {
// ...
const text2 = doSomething(text) as string
// ...
}
Let's keep the original function and create an intermediary function for undefined
function maybeDoSomething(text?: string) {
if (text === undefined) return
return doSomething(text)
}
Now you have twice the amount of function in your app, and if one of them changes you have to change its intermediary function too
function bigFunction(text?: string) {
const maybeText = Option.from(text)
// ...
// you want to map it?
const maybeText2 = maybeText.mapSync(doSomething)
// ...
// you want to map it again?
const maybeText3 = maybeText2.mapSync(doSomethingElse)
// ...
// you want to quickly throw an error?
const text4 = maybeText3.unwrap() // string
// you want to throw a custom error?
const text4 = maybeText3.okOr(new Error(`Something is wrong`)).unwrap()
// you want to get a result?
const text4 = maybeText3.ok() // Result<string, Error>
// you want to get a custom result?
const text4 = maybeText3.okOr(new Error(`Something is wrong`))
// you want to come back to "string | undefined"?
const text4 = maybeText3.inner // string | undefined
// you want to do manual check?
if (maybeText3.isSome())
const text4 = maybeText3.inner // string
else
// ...
}
FAQs
Rust-like Option for TypeScript
We found that @hazae41/option demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Security News
vlt's new "reproduce" tool verifies npm packages against their source code, outperforming traditional provenance adoption in the JavaScript ecosystem.
Research
Security News
Socket researchers uncovered a malicious PyPI package exploiting Deezer’s API to enable coordinated music piracy through API abuse and C2 server control.
Research
The Socket Research Team discovered a malicious npm package, '@ton-wallet/create', stealing cryptocurrency wallet keys from developers and users in the TON ecosystem.