Module 如何在rescript中使类型构造函数私有(当前模块中除外)?

Module 如何在rescript中使类型构造函数私有(当前模块中除外)?,module,visibility,rescript,Module,Visibility,Rescript,我想创建一个验证函数,它接受一个名称并输出一个validName类型。我不想在模块外部构造类型为ValidName的值,而不使用函数validateName 我试图将ValidName类型设为私有,但这使我无法在validateName函数中使用它(如果它在同一模块中,则为事件) 在重新描述中,什么是正确的方法 代码如下: 模块MyModule={ 键入notValidatedName=notValidatedName(字符串) 类型validName=专用validName(字符串) 类型e

我想创建一个验证函数,它接受一个名称并输出一个
validName
类型。我不想在模块外部构造类型为
ValidName
的值,而不使用函数
validateName

我试图将
ValidName
类型设为私有,但这使我无法在
validateName
函数中使用它(如果它在同一模块中,则为事件)

在重新描述中,什么是正确的方法

代码如下:

模块MyModule={
键入notValidatedName=notValidatedName(字符串)
类型validName=专用validName(字符串)
类型errorMessage=string
让validateName=(~name:notValidatedName):Belt.Result.t=>{
交换机名称{
|当Js.String2.length(name)Belt.Result.Ok(ValidName(name))时NotValidatedName(name)//不可能,因为ValidName是私有的
|\=>Belt.Result.Error(“字符串太短,不能作为名称”)
}
}
}
让nametHost=MyModule.ValidName(“aa”)//我不希望这成为可能
让notValidName=MyModule.NotValidatedName(“aa”)//这很好
让nameResult=MyModule.validateName(~name=notValidName)

可见性是在模块签名(通常是类型注释)中指定的,而不是在定义本身上指定的。您也不需要构造函数,而是应该使类型抽象,或者使类型别名私有

您可以在本地模块上指定模块签名,如下所示,但通常需要将其放入
.resi
(“接口”)文件中。可以放入模块签名中的所有内容也可以放入接口文件中。更多信息,请参阅

我会这样做:

模块MyModule:{
类型validName=私有字符串
让validateName:string=>result
} = {
类型validName=string
让validateName=name=>{
if String.length(name)Js.log(“耶!”)
|Ok()=>Js.log(“wat?”)
|Error(err)=>Js.log(err)
}
私有类型别名意味着该类型的值在各个方面都被视为
字符串
,但不能在定义该类型的模块之外构造或强制该类型的字符串

如果将别名抽象化,即将
类型validName=private string
替换为
类型validName
,则会对外部世界完全隐藏别名。与此类型的值交互的唯一方法是通过其公开的函数将其传递回模块