ReScript: Rust подібні фічі для JavaScript

Усі статті, обговорення, новини про Front-end — в одному місці. Підписуйтеся на телеграм-канал!

Нещодавно зі статті Josh Derocher-Vlk на dev.to дізнався про прикольну бібліотеку для JS, яка, в принципі, може стати замінником для TS, якщо останній чимось не подобається. Ліба специфічна. Вона підганяє JS під синтаксис Rust та насичує мову новими фічами. ReScript можна сміло порівнювати з TypeScript, тому що обидва вирішують проблему типів в JavaScript. Автор у своїй статті розповідає про декілька переваг бібліотеки.

Types

Одна з фіч ReScript полягає в тому, що він покладається на автоматичне визначення типів. Це тут працює краще ніж в TS:

// Typescript
let add = (a, b) => a + b // infers (any, any) => any

// ReScript
let add = (a, b) => a + b // infers (int, int) => int

Expression based

В ReScript як і в Rust майже все повертає значення (мається на увазі return). Але при цьому не потрібно писати явне повернення для виразу, останнє значення в блоці коду є значенням, що повертається:

// Rust
fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {y}"); // the value of y is: 4
}
// ReScript
let main = () => {
  let y = {
    let x = 3
    x + 1
  }

  Console.log(`The value of y is: ${y->Int.toString}`) // the value of y is: 4
}

Pattern Matching

Спосіб розписати логіку на основі типів або даних. Суть полягає в тому, що потрібно опрацювати всі можливі значення або типи, в інакшому випадку буде помилка при компіляції. Нагадує фічу Exhaustive Switch в TS.

// Rust
fn main() {
    let n = 42;

    match n {
        10 => println!("The number ten."),
        42 => println!("Answer to the Ultimate Question of Life, the Universe, and Everything."),
        _ => println!("Some other number."),
    }
}
// ReScript
let main = () => {
  let x = 42
  switch x {
  | 10 => Console.log("The number ten.")
  | 42 =>
    Console.log(
      "Answer to the Ultimate Question of Life, the Universe, and Everything.",
    )
  | _ => Console.log("Some other number.")
  }
}

Enums

В ReScript є свій аналог enums, як в TS, але тут це має форму чогось більш довершеного.

// Rust
enum Widget {
    Red(u8),
    Blue(u8),
    None,
}

fn main() {
    let x = Widget::Red(42);

    match x {
        Widget::Red(_) => println!("You have a red widget!"),
        Widget::Blue(_) => println!("You have a blue widget!"),
        Widget::None => println!("You have no widget!"),
    }
}
// ReScript
type widget =
  | Red(int)
  | Blue(int)
  | None

let main = () => {
  let x = Red(42)

  switch x {
  | Red(_) => Console.log("You have a red widget!")
  | Blue(_) => Console.log("You have a blue widget!")
  | None => Console.log("You have no widget!")
  }
}

Параметр замість undefined чи null

Ем, ну, я навіть не знаю, це геніально чи тупо. Але суть полягає в тому, як я зрозумів, що в ReScript немає undefined чи null, є лише None, який замінює собою обидва. На перший погляд, виглядає як вау, але точно сказати не можу, бо лише в бою стане зрозуміло.

// Rust
fn main() {
    let n = Some("Josh");

    match n {
        Some(name) => println!("Hello there {:?}!", name),
        None => println!("Who are you?")
    }
}
// ReScript
let main = () => {
  let n = Some("Josh")

  switch n {
  | Some(name) => Console.log(`Hello there ${name}!`)
  | None => Console.log("Who are you?")
  }
}


🌎 Оригінал: dev.to
🏠 Офіційний сайт: ReScript
🇺🇦 Українською: crynet.tech


👍ПодобаєтьсяСподобалось1
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Як людина, яка використовує ReScript в продакшені, маю сказати, що ReScript не має щодного відношення до Rust. Схожі вони тільки тому, Rust запозичив багато ідей з OCaml, тай сам Rescript — це просто форк OCaml, який все одно потім збирається компілятором OCaml

Я аж створив профіль щоб побути токсіком)
Просто якісь рандомні слова про бібліотеки і раст і все таке. Окрім сніпетів з валідним кодом на декількох мовах стаття шкідлива більше ніж корисна

І не набридає ж людям 15 років вирішувати «проблему» JS хрестовим походом по зміні шила на мило, тільки притрушене...

проект непогано починав, але не встиг злетіти як пацани шось пересралися, перейменувалися, короч, хай вибачають

Ідейна основа ReScript — це мова програмування OCaml.

І, якою класною не була б мова програмування, якщо для неї майже немає вакансій — мало сенсу її вчити. Хіба що для саморозвитку, але для саморозвитку є багато актуальніших мов і напрямків.

Як варіант можна розібратись як працює система типів OCaml через Rescript. Але тоді я би радив йти по хардкору і просто подивитись на OCaml :)

Було б круто побачити хоча б один приклад роботи з DOM

github.com/...​/examples/dom_example.res
ось це непоганий приклад. Ми взяли за основу ці байндінги і дописуємо по необхідності самостійно

Дякую

Якщо команда на Rust-і й хочеться й Front-end писати на Rust то треба брати yew.rs чи ще щось

ReScript то майбутній CoffeeScript

Цікаво що на сайті проекту про rust згадувань немає, а фічі типу генералізації коду і юніон типів з рекордами або тюплами були ща задовго до появи rust. Сам же проект написаний на ocaml — в якому це все теж вбудовано в мову і схоже саме який був мотиваційною складовою проекту, до чого тут rust не зрозуміло.

ReScript зустрічається у вакансіях з Rust, можливо це малось на увазі

Підписатись на коментарі