文档 / 语言手册 / 共享数据类型
Edit

共享数据类型

ReScript 内置的 stringfloatarray 值和其他一些类型的值有一个非常有趣的特性:它们在 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。同样,你也可以将传入的 JS undefined 作为 (),如果这是它唯一可能的值的话。

这些类型与 JS 略有不同,但仍然可以从 JS 中使用

  • Int:Int 是 32 位的!注意,你可以把它们看作 JS 数字,反之亦然,但是如果数字很大,那么你最好将 JS 数字作为浮点数处理。例如,我们使用 float 来绑定 Js.Date

  • Option:option 类型的 None 值会编译为 JS 的 undefinedSome 值,比如 Some(5),会编译为 5。同样地,你可以将传入的 JS undefined 作为 NoneReScript 不处理 JS null。如果你的 JS 值可能为 null,请使用 Js.Nullable 中的辅助函数

  • Exception

  • Variant:检查变体编译后的 JavaScript 输出。我们不建议专门导出 ReScript 变体去给纯 JS 代码使用,因为它们作为 JS 代码可读性不好,但是你可以这么做。

  • List:这只是一个普通的变体

非共享类型(又名内部类型)

  • Character

  • Int64

  • 惰性值

  • 剩下的其他类型

其中许多是稳定的,这意味着你仍然可以按原样对它们进行序列化/反序列化,而无需手动转换。但我们不鼓励主动窥探他们的内部结构。

如果要导出这些类型以供 JS 使用,则需要手动转换。为了获得无缝的 JS/TypeScript/Flow 集成体验,你可能想使用 genType,而不是手动进行转换。