我想做一个验证函数,取一个名字并输出一个validName
类型。我不想在ValidName
不使用函数的情况下在模块之外构造类型的值validateName
。
我试图将ValidName
类型设为私有,但它使我无法在validateName
函数中使用它(如果它在同一个模块中,则事件)。
在 rescript 中执行此操作的正确方法是什么?
这是代码:
module MyModule = {
type notValidatedName = NotValidatedName(string)
type validName = private ValidName(string)
type errorMessage = string
let validateName = (~name: notValidatedName): Belt.Result.t<validName, errorMessage> => {
switch name {
| NotValidatedName(name) when Js.String2.length(name) <= 2 => Belt.Result.Ok(ValidName(name)) // not possible because ValidName is private
| _ => Belt.Result.Error("String is too short to be a name")
}
}
}
let nameToShort = MyModule.ValidName("aa") // I don't want this to be possible
let notValidName = MyModule.NotValidatedName("aa") // This is fine
let nameResult = MyModule.validateName(~name=notValidName)