【发布时间】:2015-03-09 05:34:14
【问题描述】:
假设我的 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 版本的工作原理。我还没有处理过效果。
很抱歉,这个问题不是很清楚。我还没有足够的了解来确切地知道我想知道什么。
【问题讨论】:
标签: purescript