ReScript: Rust подібні фічі для JavaScript
Нещодавно зі статті 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.dev

11 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів