基础类型
ReScript 带有我们熟悉的基础类型,比如 string
,int
,float
等。
字符串
ReScript 字符串使用双引号进行分隔(单引号保留给下面的字符类型)。
要连接两个字符串,使用 ++
运算符:
字符串插值
有一个特殊的字符串语法,它允许:
多行字符串
没有特殊的字符转义
插值
适当的 unicode 处理
这就像 JavaScript 的反引号字符串插值,只是不需要转义特殊字符。
对于插值,如果绑定不是字符串(比如上述例子中的 name
),你必须将其转换成字符串。如果想让插值隐式地将绑定转换为字符串,可以在前面加一个 j
:
用法
在API文档中查看熟悉的 Js.String
API。由于 ReScript 字符串映射到 JavaScript 字符串,你可以混用和匹配两个标准库中的字符串操作。
技巧和诀窍
你现在有了一个很好的类型系统了!在无类型语言中,你经常需要重载字符串的意义,比如,用作:
唯一的 id:
var BLUE_COLOR = "blue"
数据结构的标识符:
var BLUE = "blue" var RED = "red" var colors = [BLUE, RED]
对象的字段名:
person["age"] = 24
枚举值:
if (audio.canPlayType() === 'probably') {...}
(ಠ_ಠ)以及在习惯了 ReScript 的替代方案后,你很快就能意识到的其他疯狂用法
你对可怜的字符串类型的意义重载的越多,类型系统(或团队成员)能够帮助你的程度就越低!ReScript 提供了简洁、快速和可维护的类型和数据结构,以替代上述使用情况(例如,后面的章节的变体)。
字符
ReScript 为单字符字符串提供了一种类型:
注意:Char 不支持 Unicode 或 UTF-8,因此不推荐使用。
将一个字符串转换为一个字符,使用 String.get("a", 0)
。将字符转换为字符串,使用 String.make(1, 'a')
。
正则表达式
ReScript 正则表达式可以干净地编译成对应的 JavaScript:
像上面这样的正则表达式的类型是 Js.Re.t
。Js.Re 模块包含你在 JS 中见到过的正则表达式辅助函数。
布尔类型
ReScript 布尔值具有 bool
类型,可以是 true
或 false
。常见的操作:
&&
:逻辑与||
:逻辑或!
:逻辑非<=
,>=
,<
,>
==
:结构相等,深入比较数据结构:(1, 2) == (1, 2)
为true
。很方便,但要谨慎使用===
:引用相等,浅层比较数据结构。(1, 2) === (1, 2)
为false
。let myTuple = (1, 2); myTuple === myTuple
为true
!=
:结构不相等!==
:引用不相等
ReScript 的 true/false
编译为 JavaScript 的 true/false
。
整数
32 位整数,必要时进行截断。我们提供对它们的常用操作:+
,-
,*
,/
等等。参见 Js.Int 的辅助函数。
当你绑定 JavaScript 数字时要小心!由于 ReScript 整数范围比 JavaScript 数字小得多,在处理大数字时,数据可能会丢失。在这种情况下,将数字绑定为 float 会更安全。当绑定到 JavaScript 日期和它们的新纪元时间(epoch time)时,要特别注意这一点。
为了提高可读性,你可以把下划线放在数字的中间,如 1_000_000
。注意,下划线可以放在数字的任何地方,不只是每隔三位数字放一个。
浮点数
浮点数需要其他运算符:+.
,-.
,*.
,/.
,等等。如 0.5 +. 0.6
。参见 Js.Float 的辅助函数。
和整数一样,你可以在字面值中使用下划线以提高可读性。
Unit
unit
类型只有一个单一的值,()
。它可以编译为 JavaScript 的 undefined
。它是一个哑(dummy)类型,在不同的地方作为占位符使用。除非你看到它,否则你不会需要它。