Giả sử tôi có hồ sơ tài trong mã PureScript của tôi với các loại sau đây:Tạo hồ sơ PureScript từ không phù hợp các đối tượng JavaScript
{ id :: Number
, username :: String
, email :: Maybe String
, isActive :: Boolean
}
Một CommonJS mô-đun có nguồn gốc từ mã PureScript. Các hàm liên quan đến người dùng được xuất sẽ được gọi từ mã JavaScript bên ngoài.
Trong đoạn mã JavaScript, một "người sử dụng" có thể được biểu diễn như:
var alice = {id: 123, username: 'alice', email: '[email protected]', isActive: true};
email
có thể null
:
var alice = {id: 123, username: 'alice', email: null, isActive: true};
email
có thể được bỏ qua:
var alice = {id: 123, username: 'alice', isActive: true};
isActive
có thể được bỏ qua, trong trường hợp đó là sumed true
: đôi khi
var alice = {id: 123, username: 'alice'};
id
là tiếc một chuỗi số:
var alice = {id: '123', username: 'alice'};
Năm đại diện JavaScript trên là tương đương và nên sản xuất hồ sơ PureScript tương đương.
Tôi làm cách nào để viết một hàm lấy đối tượng JavaScript và trả về bản ghi Người dùng? Nó sẽ sử dụng giá trị mặc định cho trường tùy chọn rỗng/bỏ qua, buộc một chuỗi id
vào một số và ném nếu trường bắt buộc bị thiếu hoặc nếu giá trị sai loại.
Hai cách tiếp cận tôi có thể thấy là sử dụng FFI trong mô-đun PureScript hoặc để xác định hàm chuyển đổi trong mã JavaScript bên ngoài. Loại sau có vẻ như lông:
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');
}
// ...
}
Tôi không chắc chắn về cách thức phiên bản FFI hoạt động. Tôi chưa làm việc với các hiệu ứng.
Tôi rất tiếc vì câu hỏi này không rõ ràng. Tôi chưa có đủ hiểu biết để biết chính xác những gì tôi muốn biết.
[ví dụ/Objects.purs] (https://github.com/purescript/purescript-foreign/blob/v0.3.0/examples/Objects.purs) có vẻ gần gũi nhất với những gì tôi đang cố gắng làm. Làm thế nào tôi có thể sửa đổi ví dụ đó để cho phép 'x' là một số hoặc một chuỗi số? – davidchambers
Một cách là tạo một loại như 'dữ liệu SoN = S String | N Number' và sau đó viết một 'dụ IsForeign' cho loại' SoN' sử dụng <|> 'điều hành' để kết hợp hai lựa chọn: 'đọc f = S <$> ReadString f <|> N <$> readNumber f' –