假设我的 PureScript 代码中有以下类型的用户记录:
{ id :: Number
, username :: String
, email :: Maybe String
, isActive :: Boolean
}
CommonJS 模块派生自 PureScript 代码。导出的用户相关函数将从外部 JavaScript 代码调用。
在 JavaScript 代码中,“用户”可以表示为:
var alice = {id: 123, username: 'alice', email: 'alice@example.com', isActive: true};
email
可能是null
:
var alice = {id: 123, username: 'alice', email: null, isActive: true};
email
可以省略:
var alice = {id: 123, username: 'alice', isActive: true};
isActive
可以省略,在这种情况下假定true
:
var alice = {id: 123, username: 'alice'};
id
不幸的是,有时是一个数字字符串:
var alice = {id: '123', username: 'alice'};
上面的五种 JavaScript 表示是等价的,并且应该产生等价的 PureScript 记录。
如何编写一个接受 JavaScript 对象并返回用户记录的函数?它将使用 null/省略的可选字段的默认值,将字符串强制id
转换为数字,如果缺少必填字段或值的类型错误,则抛出异常。
我可以看到的两种方法是在 PureScript 模块中使用 FFI 或在外部 JavaScript 代码中定义转换函数。后者似乎毛茸茸的:
function convert(user) {
var rec = {};
if (user.email == null) {
rec.email = PS.Data_Maybe.Nothing.value;
} else if (typeof user.email == 'string') {
rec.email = PS.Data_Maybe.Just.create(user.email);
} else {
throw new TypeError('"email" must be a string or null');
}
// ...
}
我不确定 FFI 版本将如何工作。我还没有处理过效果。
很抱歉,这个问题不是很清楚。我还没有足够的了解来确切地知道我想知道什么。