对于我们的API,您可以创建一个订单。该订单的各个端点的模型完全相同,但是所需的字段有什么变化。
POST-必填字段
PATCH-所有字段均为可选
PUT-所有字段均为必填
我可以在打字稿中对此建模吗,所以只有一个模型可以维护,然后提供一些有关API调用的信息以表示必填字段?
答案 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;
,Pick
和Partial
,以及一些自定义和内置conditional types,例如Required
。想法是将Exclude
的属性拆分为具有T
中的键的属性和没有键的属性。您修改K
中的属性,将其他属性保留下来,然后使用所有属性重新组合在一起构建新类型。让我们测试一下:
K
对我来说看起来不错。当然,如果您不需要像这样的通用解决方案,则可以使用特定的对象类型和键名执行相同或相似的类型映射。由你决定。
好的,希望能有所帮助;祝你好运!