我可以定义一个单一的模型,但需要一些字段来进行更改吗?

时间:2019-06-08 21:43:19

标签: typescript

对于我们的API,您可以创建一个订单。该订单的各个端点的模型完全相同,但是所需的字段有什么变化。

POST-必填字段

PATCH-所有字段均为可选

PUT-所有字段均为必填

我可以在打字稿中对此建模吗,所以只有一个模型可以维护,然后提供一些有关API调用的信息以表示必填字段?

1 个答案:

答案 0 :(得分:1)

您可以使用mapped types来专门进行此操作,其方法为必填或必填(由于在TS2.8中为removing modifiers in mapped types添加了支持)。在不特别了解您要操作的类型或键的情况下,这是我的操作方式:

'<int:pk>/'

这些基本上是彼此的镜像...它们使用一堆内置的映射类型,例如// Require<T, K> takes an object type T and a set of its keys K // and produces a new type identical to T except that the properties at keys K // are now required. If K is left out, Require<T> behaves like Required<T>. type Require<T, K extends keyof T = keyof T> = Pick<T, Exclude<keyof T, K>> & Required<Pick<T, K>> extends infer U ? { [P in keyof U]: U[P] } : never; // Optionalize<T, K> takes an object type T and a set of its keys K // and produces a new type identical to T except that the properties at keys K // are now optional. If K is left out, Optionalize<T> behaves like Partial<T>. type Optionalize<T, K extends keyof T = keyof T> = Pick<T, Exclude<keyof T, K>> & Partial<Pick<T, K>> extends infer U ? { [P in keyof U]: U[P] } : never; PickPartial,以及一些自定义和内置conditional types,例如Required。想法是将Exclude的属性拆分为具有T中的键的属性和没有键的属性。您修改K中的属性,将其他属性保留下来,然后使用所有属性重新组合在一起构建新类型。让我们测试一下:

K

对我来说看起来不错。当然,如果您不需要像这样的通用解决方案,则可以使用特定的对象类型和键名执行相同或相似的类型映射。由你决定。

好的,希望能有所帮助;祝你好运!

Link to code