共享数据类型
ReScript 内置的 string
,float
,array
值和其他一些类型的值有一个非常有趣的特性:它们在 JavaScript 中编译成完全相同的值!
这意味着,如果要向 JavaScript 端传递一个 ReScript 字符串,JS 端可以直接将其作为原生 JS 字符串来使用。它还意味着你可以导入一个 JS 字符串并假装它是一个原生 ReScript 字符串。
和大多数编译为 JS 的语言不同,在 ReScript 中,你不需要为我们的大多数值来回编写数据转换器!
共享的、双向可用的类型:
String:ReScript 字符串是 JavaScript 字符串,反之亦然。(注意:只有我们的反引号字符串
`hello 👋 ${personName}`
支持 unicode 和插值)Float:ReScript 浮点数就是 JS 的数字,反之亦然
Array:除了 JS Array API 之外,我们还提供了自己的 Belt.Array API
Tuple:编译为 JS 数组。你也可以将固定大小的异构 JS 数组视为 ReScript 元组
Boolean
Record:记录会编译成 JS 对象。因此你也可以将 JS 对象视为记录。如果它们太过动态,可以考虑在 ReScript 端将它们建模为散列表/字典
Js.Dict
或 ReScript 对象Object:ReScript 对象是 JavaScript 对象,反之亦然
Function:它们会编译为干净的 JS 函数
Module:ReScript 文件被认为是顶层模块,并被 1 比 1 地编译为 JS 文件。嵌套模块被编译为 JavaScript 对象
Polymorphic variants
Unit:
unit
类型,只有一个单一的值()
,会被编译为undefined
。同样,你也可以将传入的 JSundefined
作为()
,如果这是它唯一可能的值的话。
这些类型与 JS 略有不同,但仍然可以从 JS 中使用:
Int:Int 是 32 位的!注意,你可以把它们看作 JS 数字,反之亦然,但是如果数字很大,那么你最好将 JS 数字作为浮点数处理。例如,我们使用
float
来绑定 Js.DateOption:
option
类型的None
值会编译为 JS 的undefined
。Some
值,比如Some(5)
,会编译为5
。同样地,你可以将传入的 JSundefined
作为None
。ReScript 不处理 JSnull
。如果你的 JS 值可能为null
,请使用 Js.Nullable 中的辅助函数Exception
Variant:检查变体编译后的 JavaScript 输出。我们不建议专门导出 ReScript 变体去给纯 JS 代码使用,因为它们作为 JS 代码可读性不好,但是你可以这么做。
List:这只是一个普通的变体
非共享类型(又名内部类型):
Character
Int64
惰性值
剩下的其他类型
其中许多是稳定的,这意味着你仍然可以按原样对它们进行序列化/反序列化,而无需手动转换。但我们不鼓励主动窥探他们的内部结构。
如果要导出这些类型以供 JS 使用,则需要手动转换。为了获得无缝的 JS/TypeScript/Flow 集成体验,你可能想使用 genType,而不是手动进行转换。