我正在考虑为我的新 api 使用新的模型结构。
当前状态
我有 GET
、POST
、PUT
和 DELETE
端点。忘记 DELETE
因为它只接受一个查询参数并且没有模型。
这三个端点都使用相同的模型:
Car Model
id: string | undefined;
manufacturer: string;
date: Date;
问题
当通过 GET
端点请求一辆汽车时,理论上我可以获得一辆没有 id
的汽车。因此,当我想将 ID
传递给 DELETE
端点时,我总是需要检查 ID 是否未定义。
可能的解决方案
为每个 HTTP 方法提供不同的模型。
1. Car Model for POST request
id: string | undefined;
manufacturer: string;
date: Date;
2. Car Model for [PUT request, GET response, ...]
id: string;
manufacturer: string;
date: Date;
我还想提供PATCH
请求我也需要这个模型
3. Car Model for PATCH request
id: string | undefined;
manufacturer: string | undefined;
date: Date | undefined;
问题
- 我总共需要三个不同的模型。但这真的值得去做并被视为“良好做法”吗?
- 如果这是“良好做法”,我应该如何命名模型?
最佳答案
您只有一个型号,名为 Car
.看起来像这样。
interface Car {
id: string;
manufacturer: string;
date: Date;
}
调用其他模型是没有意义的。这些部分的东西绝不会存储在数据库或任何类型的长期存储中。它们是短暂的。
正如您已经注意到的,对于 PUT
请求和GET
响应,您总是(分别)接收或返回一个完全定义的对象,所以 Car
就够了。
您建议的PATCH
类型只是 Partial<Car>
.不需要新类型; TypeScript 为您提供了这种类型。如果你想有一个查询界面,这也可以使用,其中 GET
请求为您提供部分定义的汽车并找到所有匹配项。
为您提出POST
,你想要一个可选的 id
但所有其他字段都需要。这有点复杂,但应该看起来像
Omit<Car, "id"> & { id?: string }
上面写着“从 id
对象中删除 Car
字段并将其替换为这个可选字段”。 Omit
是 TypeScript 为我们提供的另一种实用程序类型。
你可以给这些东西命名。事实上,我鼓励你这样做。我一直提倡命名更多的东西,因为它在代码本身中提供了更多关于我们为什么要做我们正在做的事情的文档。
type PatchCar = Partial<Car>;
type PostCar = Omit<Car, "id"> & { id?: string };
PatchCar
在其名称中尖叫“Car
但对于 PATCH
”,而 Partial<Car>
并没有真正说明为什么我们只是将所有字段设为可选。
重要的是 Car
有一种表示形式model:即接口(interface)调用Car
.其他一切都只是它的一个分支。如果我们将字段添加到 Car
,我们只需要更新一个地方,而不是几个地方。记住,don't repeat yourself .
关于typescript - REST - 强类型模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73054823/