我正在考虑为我的新api使用一种新的模型 struct .

当前状态

我有GETPOSTPUTDELETE个端点.忘记DELETE吧,因为它只需要一个查询参数,没有模型.

这三个端点都使用相同的模型:

Car Model 

id: string | undefined;
manufacturer: string;
date: Date;

问题

当通过GET端点请求一辆车时,理论上我可以得到一辆没有id的车.因此,当我想将ID传递到DELETE端点时,我总是需要判断ID是否未定义.

可能的解决方案

for each 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;
}

把其他人叫做模型是没有意义的.这partial件东西决不会存储在数据库或任何一种长期存储中.它们是暂时的.

正如您已经注意到的,对于PUT个请求和GET个响应,您总是(分别)接收或返回一个完全定义的对象,因此Car个就足够了.

你提议的PATCH型仅仅是Partial<Car>.不需要新的类型;TypeScript为您提供了这种类型.如果您希望有一个查询界面,也可以使用该界面,其中GET请求会提供一个部分定义的car并查找所有匹配项.

对于建议的POST,您需要可选的id,但需要所有其他字段.这有点复杂,但应该看起来像

Omit<Car, "id"> & { id?: string }

其内容为"从Car对象中删除id字段,并将其替换为此可选字段".Omit是TypeScript为我们提供的另一种实用程序类型.

你可以给这些东西起名字.事实上,我鼓励大家这样做.我一直主张命名更多的东西,因为它在代码本身中提供了更多的文档,说明我们为什么要做我们正在做的事情.

type PatchCar = Partial<Car>;
type PostCar = Omit<Car, "id"> & { id?: string };

PatchCar在它的名字中喊着"Car,但为了PATCH",而Partial<Car>实际上并没有说why,我们只是将所有字段都设置为可选.

重要的是,Car模型有一个表示:即称为Car的接口.其他一切都只是它的一个分支.如果我们在Car中添加字段,我们只需要在一个地方更新它,而不是在几个地方.记住,don't repeat yourself.

Typescript相关问答推荐

创建一个通用上下文,允许正确推断其中的子项

等待的R没有用响应对象展开到R

为什么缩小封闭内部不适用于属性对象,但适用于声明的变量?

如果请求是流,如何等待所有响应块(Axios)

缩小并集子键后重新构造类型

为什么不能使用$EVENT接收字符串数组?

有没有可能为这样的函数写一个类型?

在Reaction-Native-ReAnimated中不存在Animated.Value

剧作家元素发现,但继续显示为隐藏

防止重复使用 Select 器重新渲染

在React中定义props 的不同方式.FunctionalComponent

在TypeScript中扩展重载方法时出现问题

类型脚本-在调用期间解析函数参数类型

基于未定义属性的条件属性

我不明白使用打字脚本在模板中展开参考

字幕子集一个元组的多个元素

如何使函数参数数组不相交?

Angular另一个组件的nativeelement未定义

如何将参数传递给条件函数类型

如何解决联合类型上的此表达式不可调用?