Skip to content

Types

ReluxScript has a static type system that compiles to both JavaScript and Rust types.

Primitive Types

Str

String type that maps to both platforms:

reluxscript
let name: Str = "hello";

Compiles to:

  • Babel: string
  • SWC: String

Numbers

reluxscript
let count: i32 = 42;        // 32-bit integer
let ratio: f64 = 3.14;      // 64-bit float

Compiles to:

  • Babel: number (both)
  • SWC: i32 and f64

Boolean

reluxscript
let flag: bool = true;

Compiles to:

  • Babel: boolean
  • SWC: bool

Unit Type

reluxscript
let empty: () = ();

Compiles to:

  • Babel: undefined
  • SWC: ()

Container Types

Vec<T>

Dynamic array/vector:

reluxscript
let items: Vec<Str> = vec!["a", "b", "c"];
items.push("d");

Compiles to:

  • Babel: Array
  • SWC: Vec<T>

Option<T>

Optional value (may or may not exist):

reluxscript
let maybe: Option<Str> = Some("value");
let nothing: Option<Str> = None;

if let Some(value) = maybe {
    println!("Got: {}", value);
}

Compiles to:

  • Babel: T | null
  • SWC: Option<T>

Result<T, E>

Result type for error handling:

reluxscript
fn parse_value(s: &Str) -> Result<i32, Str> {
    if s.is_empty() {
        return Err("Empty string");
    }
    Ok(42)
}

Compiles to:

  • Babel: { ok: boolean, value?: T, error?: E }
  • SWC: Result<T, E>

HashMap<K, V>

Key-value map:

reluxscript
let mut map: HashMap<Str, i32> = HashMap::new();
map.insert("key", 42);

Compiles to:

  • Babel: Map or Object
  • SWC: HashMap<K, V>

HashSet<T>

Set of unique values:

reluxscript
let mut set: HashSet<Str> = HashSet::new();
set.insert("item");

Compiles to:

  • Babel: Set
  • SWC: HashSet<T>

Reference Types

Immutable Reference

reluxscript
fn read_node(node: &CallExpression) {
    // Can read, cannot modify
    let name = node.callee.name.clone();
}

Compiles to:

  • Babel: Regular value (no concept of references)
  • SWC: &T

Mutable Reference

reluxscript
fn transform_node(node: &mut CallExpression) {
    // Can read and modify
    *node = Statement::empty();
}

Compiles to:

  • Babel: Regular value
  • SWC: &mut T

Tuple Types

Fixed-size collections of heterogeneous types:

reluxscript
let pair: (Str, i32) = ("answer", 42);
let triple: (bool, f64, Str) = (true, 3.14, "pi");

// Destructuring
let (name, value) = pair;

Compiles to:

  • Babel: Arrays [T1, T2]
  • SWC: Tuples (T1, T2)

AST Node Types

Expression Types

reluxscript
Identifier
CallExpression
MemberExpression
BinaryExpression
UnaryExpression
ArrowFunctionExpression
ObjectExpression
ArrayExpression

Statement Types

reluxscript
FunctionDeclaration
VariableDeclaration
IfStatement
ForStatement
WhileStatement
ReturnStatement
BlockStatement
ExpressionStatement

JSX Types

reluxscript
JSXElement
JSXAttribute
JSXExpressionContainer
JSXText

TypeScript Types

reluxscript
TSInterfaceDeclaration
TSTypeAnnotation
TSTypeReference

See Node Types for complete reference.

Type Inference

ReluxScript infers types when possible:

reluxscript
let name = "hello";          // Inferred as Str
let count = 42;              // Inferred as i32
let items = vec![1, 2, 3];  // Inferred as Vec<i32>

Type Conversion

Explicit Conversion

reluxscript
let num: i32 = 42;
let text: Str = format!("{}", num);  // Convert to string

The .into() Method

reluxscript
let s: Str = "hello".into();

Note: .into() is a no-op in Babel (type conversions are implicit in JavaScript).

Generic Functions

Functions can have type parameters:

reluxscript
fn identity<T>(value: T) -> T {
    value
}

fn map_items<F>(items: Vec<Str>, f: F) -> Vec<Str>
where
    F: Fn(Str) -> Str
{
    items.iter().map(|s| f(s.clone())).collect()
}

Compiles to:

  • Babel: Generics stripped (no type parameters)
  • SWC: Generics preserved

Type Aliases

Create aliases for complex types:

reluxscript
type NodeVisitor = fn(&mut Node, &Context);
type Result<T> = Result<T, Str>;

Next Steps

Released under the MIT License.