属性(装饰器)
像许多其他语言一样,ReScript 允许对一段代码进行标注以表达额外的功能。下面是一个例子:
@inline
标注使 mode
的值被内联到它的使用地点(见输出)。我们把这种标注称为“属性”(或 JavaScript 中的“装饰器”)。
一个属性以 @
开头,放在要标注的项目之前。在上面的例子中,它被挂在 let 绑定上。
用法
注意:在以前的版本(< 8.3)中,我们所有与互操作有关的属性都以
bs.
前缀开始(bs.module
,bs.val
)。在较新的 ReScript 版本中运行编译器的格式化,将自动删除它们。
你可以把属性放在几乎任何地方,你甚至可以像函数调用一样直观地使用它们来添加额外数据,下面是几个常用属性(会在其他章节解释作用):
@@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
@@warning("-27")
是注释文件的独立属性。这些属性以@@
开头,这里它携带的数据是"-27"
。你可以在这里找到所有可用的警告编号。@unboxed
标注了类型定义。@val
标注了external
语句。@as("aria-label")
标注了ariaLabel
记录字段。@deprecated
标注了customDouble
表达式。这会在编译时显示一个警告,告诉用户不要长期依赖这个方法。@deprecated("Use SomeOther.customTriple instead")
标注了customTriple
表达式,用一个字符串来描述废弃的原因。
扩展点
还有第二类属性,叫做“扩展点”(早期系统的一个残余术语):
扩展点不 标注 一个项目,他们 就是 一个项目。通常将它们用作占位符,编译器会用另一个项目隐式替换它们。
扩展点以 %
开头。一个独立的扩展点(类似于独立的普通属性)以 %%
开头。