我正在尝试输入HTTP PATCH document structure,并且可能发誓我看到基于另一个prop值的条件Typescript属性,但是我不确定。也许也可以通过联合类型来做到这一点...
以下是架构:
[
{ "op": "test", "path": "/a/b/c", "value": "foo" },
{ "op": "remove", "path": "/a/b/c" },
{ "op": "add", "path": "/a/b/c", "value": [ "foo", "bar" ] },
{ "op": "replace", "path": "/a/b/c", "value": 42 },
{ "op": "move", "from": "/a/b/c", "path": "/a/b/d" },
{ "op": "copy", "from": "/a/b/d", "path": "/a/b/e" }
]
请注意,有一个op
属性,其值可以为"test" | "remove" | "add" | "replace" | "move" | "copy"
。 move
和copy
操作具有from
属性,并且不包含其他(value
除外)具有的remove
属性。
很显然,我可以将from
和value
设置为可选,然后继续生活,但是我失去了验证方面,因此我想知道是否有可能(如果不是很容易)定义遵循模式的类型。
答案 0 :(得分:3)
您正在寻找union types,特别是受歧视的工会。
type Schema =
| { "op": "test", "path": string, "value": string }
| { "op": "remove", "path": string }
| { "op": "add", "path": string, "value": string[] } // value can be [string, string]
| { "op": "replace", "path": string, "value": 42 }
| { "op": "move", "from": string, "path": string }
| { "op": "copy", "from": string, "path": string }
let o: Schema = { op: "move", from: "", path: "" }
let o2: Schema = { op: "remove", from: "", path: ""} // err