typescript - REST - 强类型模型

标签 typescript rest

我正在考虑为我的新 api 使用新的模型结构。

当前状态

我有 GETPOSTPUTDELETE 端点。忘记 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;

问题

  1. 我总共需要三个不同的模型。但这真的值得去做并被视为“良好做法”吗?
  2. 如果这是“良好做法”,我应该如何命名模型?

最佳答案

您只有一个型号,名为 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/

相关文章:

typescript - 将 typescript 定义文件编译到 wwwroot 文件夹时出现“重复标识符”错误

typescript - 关于特殊组件定义的 JSX 正确类型化的问题

angular - Ionic 2,在 ionic 段中使用谷歌地图

java - Angular 2 将文件上传到 Java Api

java - @JsonIgnore 不适用于 Spring Boot 应用程序

typescript - Webpack 无法找到 TypeScript(显然)找到的导入

javascript - 忽略负鼠断路器中的 HTTP 404 错误

postgresql - 如何防止特定列通过 REST API 更新显式设置它们的值?

java - 是否必须将字节流 POST 到任何接受文件的 API,还是依赖于 API?

rest - Teamcity API,项目中构建配置的状态