如何在 Rescript 中强制函数为 return 'unit'?
How to force a function to return 'unit' in Rescript?
我正在尝试模拟使用 rescript 写入数据库的副作用。
所以我想在调用repository.add
时将数据推送到一个数组中。 Js.Array.push
return 一个 int
,我不在乎。我想强制 return unit
以便我的签名显示 unit
这让我立即知道此功能会产生副作用。
这是代码 (and a playground here):
module Person = {
type entity = {
firstName: string
}
type repository = {
add: entity => unit,
getAll: unit => array<entity>
}
let createRepository = (): repository => {
let storage: array<entity> = []
{
add: entity => {
Js.Array.push(entity, storage) // This has type: int -> Somewhere wanted: unit
() // how to force to return 'unit' there ?
},
getAll: () => storage
}
}
}
一个函数将 return unit
如果你 return ()
,就像你一样。这不是真正的问题所在。编译器抱怨的原因是您隐含地忽略了由 Js.Array.push
编辑的值 return,这通常是一个错误。您可以通过 显式 忽略它来关闭编译器:
let _: int = Js.Array.push(entity, storage)
编辑:我还要补充一点,您可能要考虑使用更适合该范例的数据结构和 API。我可能会使用 list
并使 storage
成为 ref<list>
,但这在一定程度上取决于您要用它做什么。
我正在尝试模拟使用 rescript 写入数据库的副作用。
所以我想在调用repository.add
时将数据推送到一个数组中。 Js.Array.push
return 一个 int
,我不在乎。我想强制 return unit
以便我的签名显示 unit
这让我立即知道此功能会产生副作用。
这是代码 (and a playground here):
module Person = {
type entity = {
firstName: string
}
type repository = {
add: entity => unit,
getAll: unit => array<entity>
}
let createRepository = (): repository => {
let storage: array<entity> = []
{
add: entity => {
Js.Array.push(entity, storage) // This has type: int -> Somewhere wanted: unit
() // how to force to return 'unit' there ?
},
getAll: () => storage
}
}
}
一个函数将 return unit
如果你 return ()
,就像你一样。这不是真正的问题所在。编译器抱怨的原因是您隐含地忽略了由 Js.Array.push
编辑的值 return,这通常是一个错误。您可以通过 显式 忽略它来关闭编译器:
let _: int = Js.Array.push(entity, storage)
编辑:我还要补充一点,您可能要考虑使用更适合该范例的数据结构和 API。我可能会使用 list
并使 storage
成为 ref<list>
,但这在一定程度上取决于您要用它做什么。