Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >ReasonML——新的前端强类型语言简介

ReasonML——新的前端强类型语言简介

作者头像
黄Java
发布于 2019-03-13 07:41:39
发布于 2019-03-13 07:41:39
1.8K00
代码可运行
举报
文章被收录于专栏:黄Java的地盘黄Java的地盘
运行总次数:0
代码可运行

背景介绍

从有前端到现在,JavaScript 语言一直都是实现前端逻辑的首选。但是,由于 JavaScript 是一个弱类型语言,很难进行相关的类型检测。因此在构建大型应用时,使用 JavaScript 难免会遇到一些隐式类型转换等相关的问题,从而导致程序的 bug。

在当前的选择中,有两个流派,都能够解决 JavaScript 弱类型语言带来的弊病,给前端带来强类型语言的支持。

  • 第一个是 Facebook 提出的 Flow——这个的优点在于我们能够在不对现有代码进行任何改造的情况下,为现有的代码增加一个静态类型检测器,从而避免由于类型转换等问题带来的 bug。
  • 第二个是以微软开发的 TypeScript 为首的前端新强类型语言——这类语言的优势是从根本上支持了强类型语言,可以在编译时通过类型推导与判断来从根本上解决类型转换问题,约束开发模型。但是,这类语言的缺点也非常明显,如果需要支持相关的类型检测和推导,那么就需要对原有的代码进行改造,必定会花费一定的人力。在强类型语言中,也分为了两种类型。
    • 第一种是 TypeScript 这类对 JavaScript 兼容的语言——正如前面所说,TypeScript 的优势在于:它能够完全兼容 JavaScript 语言。具体是什么意思呢,就是说你的代码可以是部分 TypeScript 语言,部分 JavaScript 语言的。TypeScript 的代码可以调用 JavaScript 的代码,同时反过来也可以成立;缺点也是由于对 JavaScript 的兼容:由于需要完全兼容 JavaScript,因此它没有办法舍弃一些 JavaScript 中的一些缺陷。
    • 第二种则是我们在本文中需要介绍的 ReasonML ,这类对 JavaScript 不兼容的语言——与第一种完全相反,由于不需要兼容 JavaScript,我们可以完全舍弃 JavaScript 的缺陷,用一套新的语法规则来实现我们的需求;但是,由于不兼容 JavaScript 语言,因此我们在开发时只能从头开始进行项目的开发,也不能充分发挥 JavaScript 生态带来的优势。

作为最近被大家关注的越来越多的强类型语言,ReasonML 的发展也是需要我们持续关注的。

ReasonML 起源

说了这么多背景,我们来正式介绍下 ReasonML 这门语言。首先,让我们来看下官网对于 ReasonML 的介绍。

Reason lets you write simple, fast and quality type safe code while leveraging both the JavaScript & OCaml ecosystems. Reason利用 JavaScript 和 OCaml 语言的生态,让你编写简单、快速和高质量类型安全的代码。

从这个介绍中我们可以知道, ReasonML 是从 OCaml 语言衍生出来的,可以支持 JavaScript 的新的强类型语言。首页介绍中,还提到了这个语言的三个特点:

  • 无争论的类型系统(Types without hassle),有效、安全的类型推论意味着你很少需要进行类型注释,但是它可以帮你检查所有内容的类型。
  • 简单的 JavaScript 交互(Easy JavaScript interop),可以没有任何麻烦的使用 NPM/Yarn 中的包,或者在你学习的时候,你甚至可以使用一小段 JavaScript。
  • 灵活有趣(Flexible & Fun),适用于网站、动画、游戏、服务、脚手架工具等。通过这些例子我们就可以得到灵感。

ReasonML 入门介绍

听了这么多关于 ReasonML 的介绍,我们来简单的看下相关的语法。通过相关的语法和示例,我们能够帮助我们更好的理解这门语言。

我们就使用官方的一些简单的示例来快速入门这个语言。

安装与编译

因为目前浏览器无法直接识别强类型语言,因此我们需要通过编译器,将强类型语言编译成 JavaScript 以后才能够在前端浏览器或者 Node.js 中运行。

首先,我们来看下如何进行安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
npm install -g bs-platform

首先,我们通过 NPM 来对编译平台 bs-platform 进行全局安装,安装完成后,我们就可以使用这个 cli 自带的命令了。

安装完成后,我们需要初始化一个项目,因此我们需要执行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
bsb -init my-new-project -theme basic-reason

通过这个命令,我们就创建了一个名字为 my-new-project 的项目文件了。

这个时候,我们进入这个项目文件夹中,看看这里面到底初始化了哪些东西。首先我们来看下 package.json 文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
  "name": "my-new-project",
  "version": "0.1.0",
  "scripts": {
    "build": "bsb -make-world",
    "start": "bsb -make-world -w",
    "clean": "bsb -clean-world"
  },
  "keywords": [
    "BuckleScript"
  ],
  "author": "",
  "license": "MIT",
  "devDependencies": {
    "bs-platform": "^4.0.18"
  }
}

接下来,我们先来看下 src/Demo.re 文件的内容。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Js.log("Hello, BuckleScript and Reason!");

我们需要重点关注的就是,我们可以通过 npm run build 命令来编译整个项目,它会将 src/Demo.re 编译成 src/Demo.re.js 文件。让我们来看下编译出来的内容是什么样子的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Generated by BUCKLESCRIPT VERSION 4.0.18, PLEASE EDIT WITH CARE
'use strict';


console.log("Hello, BuckleScript and Reason!");

/*  Not a pure module */

大家可以看到,我们通过 ReasonML 的编译器,将 ReasonML 的代码编译成了 JavaScript。

语法介绍

说完了构建编译相关的流程,我们来正式看下 ReasonML 这门语言的语法。

ReasonML 的类型系统可以自动进行类型推断,在本文介绍中我会尽可能详细的进行介绍,但是如果没有声明具体类型,大家可以自主进行推断。

我们可以通过下面这个表格来快速看下当前的数据结构

数据类型

示例

字符串

"Hello"

字符

'x'

整型数字

23, -23

浮点型数字

23.0, -23.0

整型数字加法

23 + 1

浮点型数字加法

23.0 +. 1.0

整型数字除法/乘法

2 / 23 * 1

浮点型数字除法/乘法

2.0 /. 23.0 *. 1.0

浮点型数字求幂

2.0 ** 2.0

字符串组合

"Hello " ++ "World"

比较运算符

>, <, >=, =<

布尔运算符

!, &&, `

`

引用(浅)比较,结构(深)比较

===, ==

不可变列表

[1, 2, 3]

不可变前置声明(Immutable Prepend)

[item1, item2, ...theRest]

元组(Tuple)

[1, "string"]

数组

`[

1, 2, 3

]`

记录(Records)

type player = {score: int}; {score: 100}

对象

type tesla = {var red = "red"; pub color = red;}; tesla#color

注释

/* Comment here */

这里面有一些内容需要详细介绍下差别。

  • 字符与字符串。在 ReasonML 中,字符与字符串分别是用单引号和双引号来进行表示,而不是统一认为是字符串,单双引号通用。
  • 浅比较和深比较。在 JavaScript 中,===== 对于对象和数组之类的变量来说,都是进行地址的比较。而在 ReasonML 中,我们可以在运算符中实现深比较。
  • 不可变列表与数组。在 JavaScript 中,数组可以存储任意类型的内容。而在 ReasonML 中,出现了一个不可变列表,只能存储同一种数据类型(比如全部都是整型数字),并且是不可变数据类型。ReasonML 的数组是一个可变数据类型,但是仍然只能存储同一种数据类型。如果需要实现存储不同的数据类型,则需要使用元组(Tuple)——一个不可变的有序类型,具体代码如下: let ageAndName = (24, "Lil' Reason");
  • 对象与记录。在 ReasonML 中,出现了对象和记录两种相似的数据类型,我们来看下两者的区别。记录是一个需要提前声明的默认不可变的数据结构,在 ReasonML 中推荐使用。而在 ReasonML 的对象,则是一个不需要提前声明的数据结构。不过在 ReasonML 中,推荐优先使用记录。

关于语法相关的内容,我只是简单介绍了一下核心的数据结构,有很多内容没有介绍到,如果大家想要系统的学习 ReasonML 的话,可以看一下官方文档

与 JavaScript 兼容方式

如果我们需要在 ReasonML 中使用 JavaScript 代码,我们可以按照如下的方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[%bs.raw {| console.log('here is some javascript for you') |}];

上面的代码经过编译后,可以得到如下的 JavaScript 代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'use strict';
console.log('here is some javascript for you');

这个方法与全局注入变量的方式类似,会直接将上述代码替换成编译后的 JavaScript 代码。因此我们可以这么用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let x = [%bs.raw {| 'here is a string from javascript' |}];

得到的代码为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var x = ( 'here is a string from javascript' );
与 JavaScript 语法差异

许多的语法差异我们在上述语法介绍中都已经介绍过了,如果需要详细的比对,可以看官方文档中的语法比较

总结

ReasonML 是一门比 TypeScript 约束严格的多的强类型语言(TypeScript 编译报错可以选择忽略掉,不影响使用)。强类型语言对于大型的项目开发来说,确实可以带来明显的优势。但是,我们能不能够大规模使用 ReasonML 呢?

先说下个人的基本判断:持续关注,不建议在大型应用场景中使用。

从 ReasonML 目前的情况来看,它与 TypeScript 非常相似。

TypeScript 由于对 JavaScript 的生态完全兼容,所以即使我们需要进行部分代码的重写,我们仍然可以快速的复用 JavaScript 的强大生态。

而由于 ReasonML 来说,这个方面就会明显相差不少。与此同时,ReasonML 的相关语法与 JavaScript 相差较大,因此对于前端工程师的学习成本来说,也有一定的提提升。

综上所述,如果大家需要在前端使用强类型语言来构建大型项目,建议选择 TypeScript 语言。

作者介绍与转载声明

黄珏,2015年毕业于华中科技大学,目前任职于美团基础研发平台大象业务部,独立负责大象 Web SDK 的开发与维护。

本文未经作者允许,禁止转载。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2017值得一瞥的JavaScript相关技术趋势
跨年前两天,Dan Abramov在Twitter上提了一个问题: JS社区毫不犹豫的抛出了它们对于新技术的预期与期待,本文内容也是总结自Twitter的回复,按照流行度降序排列。有一个尚未确定的小
前朝楚水
2018/04/03
1.3K0
2017值得一瞥的JavaScript相关技术趋势
前端专家聊JS语言家族新成员——R&B
摘要 相信大家对以CoffeeScript、TypeScript为代表的编译到JavaScript的语言已经不陌生。本次分享将介绍 JS 平台语言家族的重要新成员R&B——Reason(Faceboo
IT大咖说
2018/04/04
1.5K0
TypeScript 是弱类型
以下这段代码不管是在 JavaScript 中还是在 TypeScript 中都是可以正常运行的,运行时数字 1 会被隐式类型转换为字符串 '1',加号 + 被识别为字符串拼接,所以打印出结果是字符串 '11'。
HoneyMoose
2021/11/16
6840
TypeScript 是弱类型
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
这篇文章综合介绍了四种分类,特别地,为了方便大家快速有效的学习,笔者尝试用思维导图的办法描述编程语言的区别。一般来讲,看第一个图就够了。但如果你想更深入地了解,也可以参考下面的文字表述。
陈满iOS
2018/09/10
9.7K1
编程语言傻傻分不清:弱类型、强类型、动态类型、静态类型
【TypeScript】001-TypeScript 的概述
这种灵活性就像一把双刃剑,一方面使得 JavaScript 蓬勃发展,无所不能,从 2013 年开始就一直蝉联最普遍使用的编程语言排行榜冠军;另一方面也使得它的代码质量参差不齐,维护成本高,运行时错误多。
訾博ZiBo
2025/01/06
710
【TypeScript】001-TypeScript 的概述
下一代前端语言之争,JavaScript 要被新语言反超?
作者|Nicholas Yang 译者|核子可乐 策划|褚杏娟 假如大家正在编写前端代码,那么会选择哪种编程语言?目前来看,最有希望的选手主要有三个:首先是最常规的 JavaScript,然后是能编译为 WebAssembly(Wasm)的语言,最后则是能编译成 JavaScript 的语言。 常规 JavaScript 需要的配套工具最少,但代价是调试起来相当麻烦,代码可读性也差。虽然选择 JS 确实门槛较低,不过除了一味痴迷“极简主义”的铁粉以外,我个人觉得这个选项只能说一般。 能编译为 Wa
深度学习与Python
2023/03/29
4020
下一代前端语言之争,JavaScript 要被新语言反超?
谁告诉的你们Python是强类型语言!站出来,保证不打你!
最近有些学员问我,Python到底是强类型语言,还是弱类型语言。我就直接脱口而出:Python是弱类型语言。没想到有一些学员给我了一些文章,有中文的,有英文的,都说Python是强类型语言。我就很好奇,特意仔细研究了这些文章,例如,下面就是一篇老外写的文章:
蒙娜丽宁
2020/08/31
1.1K0
谁告诉的你们Python是强类型语言!站出来,保证不打你!
Go 数据类型篇(二):布尔类型、整型、浮点型和复数类型
与其他静态语言不同的是,Go 新增了一个通道类型,该类型主要用于并发编程时不同协程之间的通信,后面介绍 Go 语言并发编程的时候会详细介绍它。
学院君
2023/03/03
1.4K0
Go 数据类型篇(二):布尔类型、整型、浮点型和复数类型
编译型语言、解释型语言、静态类型语言、动态类型语言、强类型语言、弱类型语言概念与区别
编译型语言和解释型语言 1、编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。 优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。 缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的
Albert陈凯
2018/04/04
3.2K0
前端工程化发展历史
毕业前对前端工程化一直没有什么切身的体会,现在工作也有半年多了,体会也越来越深,npm,yarn,Webpack ,gulp,Babel,ESlint,TypeScript 最近准备一一去深入了解一下,看到一篇不错的关于前端工程化的发展过程,就翻译了一下,How it feels to learn JavaScript in 2016,
windliang
2022/09/23
7890
MoonBit:Wasm优化语言,代码量少于Rust
MoonBit 是一种端到端的编程语言,针对 WebAssembly 进行了优化,同时也可以编译成 JavaScript 和汇编代码。
云云众生s
2024/06/30
2080
强类型 JavaScript 的解决方案
JavaScript 是一种弱类型(或称动态类型)语言,即变量的类型是不确定的。 x = 5; // 5 x = x + 'A'; // '5A' 上面代码中,变量x起先是一个数值,后来是一个字符串,类型完全由当前的值决定,这就叫弱类型。 弱类型的好处是十分灵活,可以写出非常简洁的代码。但是,对于大型项目来说,强类型更有利,可以降低系统的复杂度,在编译时就发现类型错误,减轻程序员的负担。 一直有人尝试,让 JavaScript 变成强类型语言。在官方最终支持强类型之前,本文介绍三种现在就可
ruanyf
2018/04/12
9770
强类型 JavaScript 的解决方案
【Python】Python中的数据类型
在上一篇内容中我们介绍了Python中的常量与变量的相关内容。常量也就是不可改变的量,与之对应的变量则是可以改变的量。
蒙奇D索隆
2024/09/07
810
【Python】Python中的数据类型
Java Grammar:数据类型
我们知道,Java是一种 强类型 语言,类型对于Java语言来说非常的重要不言而喻,在Java中,分为 基础数据类型 和 引用数据类型 ,其中基础数据类型分为了 四类八种:
山禾说
2019/08/08
5890
Java Grammar:数据类型
Go 数据类型篇(四):基本数据类型之间的转化
通过前面两篇教程,学院君已经介绍完了 Go 语言中的基本数据类型,分别是布尔类型、整型、浮点型、复数类型、字符串和字符类型,此外,Go 语言还支持这些基本数据类型之间的转化,不过由于 Go 是强类型语言,所以不支持动态语言那种自动转化,而是要对变量进行强制类型转化。
学院君
2023/03/03
5600
Go 数据类型篇(四):基本数据类型之间的转化
编程语言的弱类型、强类型、动态类型、静态类型的解释
例如在SQL语言中,当一个整数与一个浮点数相加时,系统会自动将整数转换为浮点数,以便进行运算并得到正确的结果;或者对int类型列 输入一个字符串类型,如果系统发现该字符串可以转化成int类型数字,则会将其自动转化成int类型数字
黎鹤舞
2024/03/19
7100
编程语言的弱类型、强类型、动态类型、静态类型的解释
PHP数据类型转换
        Java,c,c++等强类型语言必须先声明数据类型,java和c声明一个整数型(int a=100;)
十月梦想
2018/08/29
1.7K0
Go 语言基础入门教程 —— 数据类型篇:概述和布尔类型
相较于 PHP,多出了字符类型(单个字符)、错误类型和复数类型,PHP 通过系统级配置函数 error_reporting 定义应用的错误报告级别,不区分单独的字符与字符串类型,Go 还对整型的精度及是否有符号(正数还是负数)做了区分,PHP 则只有一个 int 类型标识整型数据,另外 PHP 通过 float 和 double 来区分浮点型精度,这一点也是 Go 语言 和 PHP 不一样的地方。
学院君
2019/08/08
5460
【Java SE语法篇】2.数据类型和变量
其中,“Hello world!”,100,3.14,‘A’,true/false都是常量,将其称为字面常量。
爱敲代码的小杨.
2024/05/07
810
【Java SE语法篇】2.数据类型和变量
《JavaSE-第二章》之基本数据类型与类型转换
java语言有三种输出方式,第一种是打印不换行,第二种是打印并换行,第三种是格式化输出。
用户10517932
2023/10/07
2090
《JavaSE-第二章》之基本数据类型与类型转换
推荐阅读
相关推荐
2017值得一瞥的JavaScript相关技术趋势
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验