如何使用现有记录类型创建新的记录类型?



我正在尝试使用Suave创建一个简单的TodoREST 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 中,我可以使用OmitPick等实用程序类型来创建新类型,例如:

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"}")

最新更新