我正在尝试使用Suave创建一个简单的Todo
REST API。Todo
类型定义为:
type Todo =
{ id: Guid
title: string
isComplete: bool
deadline: DateTime option }
使用">按 ID 获取"GET /todos/{guid}
和">获取列表"GET /todos/
API 时,此类型非常有效。但是,在创建新的Todo
项时,有效负载不包含id
属性,因为它将作为数据库操作的一部分自动生成。因此,进行了以下 REST API 调用:
POST /todos/
{
"title": "Hello world",
"isComplete": false,
"deadline": null
}
但是,问题是 JSON 反序列化中断,因为id
字段不可用。如何处理这种情况?将id
声明为option
感觉不正确,因为它不是正确的抽象。在 TypeScript 中,我可以使用Omit
、Pick
等实用程序类型来创建新类型,例如:
export interface Todo {
id: string;
title: string;
isComplete: boolean;
deadline?: string
}
// Create new Type from existing type!
export type TodoInput = Omit<Todo, 'id'>;
let payload: TodoInput = {
isComplete: false,
title: "Hello"
}
如何在 F# 中实现类似的结果?
即使您没有 id,也应该能够反序列化。 下面对我来说很好用。id 将为 Guid.empty。
open Newtonsoft.Json
type Todo =
{ id: Guid
title: string
}
let data = JsonConvert.DeserializeObject<Todo>("{"title":"test"}")