文档 / 语言手册 / 属性(装饰器)
Edit

属性(装饰器)

像许多其他语言一样,ReScript 允许对一段代码进行标注以表达额外的功能。下面是一个例子:

ReScriptJS Output
@inline
let mode = "dev"

let mode2 = mode

@inline 标注使 mode 的值被内联到它的使用地点(见输出)。我们把这种标注称为“属性”(或 JavaScript 中的“装饰器”)。

一个属性以 @ 开头,放在要标注的项目之前。在上面的例子中,它被挂在 let 绑定上。

用法

注意:在以前的版本(< 8.3)中,我们所有与互操作有关的属性都以 bs. 前缀开始(bs.modulebs.val)。在较新的 ReScript 版本中运行编译器的格式化,将自动删除它们。

你可以把属性放在几乎任何地方,你甚至可以像函数调用一样直观地使用它们来添加额外数据,下面是几个常用属性(会在其他章节解释作用):

ReScriptJS Output
@@warning("-27")


@unboxed
type a = Name(string)

@val external message: string = "message"

type student = {
  age: int,
  @as("aria-label") ariaLabel: string,
}

@deprecated
let customDouble = foo => foo * 2

@deprecated("Use SomeOther.customTriple instead")
let customTriple = foo => foo * 3
  1. @@warning("-27") 是注释文件的独立属性。这些属性以 @@ 开头,这里它携带的数据是 "-27"。你可以在这里找到所有可用的警告编号。

  2. @unboxed 标注了类型定义。

  3. @val 标注了 external 语句。

  4. @as("aria-label") 标注了 ariaLabel 记录字段。

  5. @deprecated 标注了 customDouble 表达式。这会在编译时显示一个警告,告诉用户不要长期依赖这个方法。

  6. @deprecated("Use SomeOther.customTriple instead") 标注了 customTriple 表达式,用一个字符串来描述废弃的原因。

扩展点

还有第二类属性,叫做“扩展点”(早期系统的一个残余术语):

ReScriptJS Output
%raw("var a = 1")

扩展点不 标注 一个项目,他们 就是 一个项目。通常将它们用作占位符,编译器会用另一个项目隐式替换它们。

扩展点以 % 开头。一个独立的扩展点(类似于独立的普通属性)以 %% 开头。