Write JavaScript with Rust's mental model.
- Impl — Rust-style traits.
Struct(data) is separated fromImpl(behavior), and implementations are stamped onto classes at load time. No prototype chain crawling. - Result / Option —
std::result::Resultandstd::option::Optionin JavaScript. Use the core only, or opt into extensions one by one.
pnpm add @alex6357/rustyjs// The root entry has everything: impl, result, option, and all builtin
// extensions. Use it if you want all of rustyjs.
import { err, initImpl, none, ok, some } from "@alex6357/rustyjs";
// If you only need one part, import it on demand.
import { initImpl } from "@alex6357/rustyjs/impl";
import { ok } from "@alex6357/rustyjs/result";
import { some } from "@alex6357/rustyjs/option";Traits:
import { initImpl } from "@alex6357/rustyjs/impl";
const { STATE, ImplFor } = initImpl();
// Trait
interface TraitHasName {
readonly name: string;
}
// Class is still the entry point.
// The interface mixin lets the language server know what methods are available.
interface Dog extends TraitHasName {}
class Dog {
constructor(name: string) {
STATE.init(this, { name });
}
}
// Implementation block, i.e. `impl TraitHasName for Dog`
@ImplFor(Dog)
class ImplHasNameForDog implements TraitHasName {
get name() {
return STATE.get(this).name;
}
}
new Dog("Buddy").name; // "Buddy"Result and Option:
import { err, ok, wrap } from "@alex6357/rustyjs/result";
import { none, some } from "@alex6357/rustyjs/option";
ok(21)
.map((x) => x * 2)
.unwrap(); // 42
err("boom").unwrapOr(0); // 0
wrap(() => JSON.parse("nope")).isErr(); // true
some(21)
.map((x) => x * 2)
.unwrap(); // 42- Impl - traits, state, inheritance and performance
- Result and Option - full import, core only, extensions and writing your own
# Build
pnpm build
# Test
pnpm testLicensed under either of Apache License, Version 2.0 or MIT license at your option.