基于另一个属性值的条件打字稿类型属性

时间:2019-11-13 17:04:40

标签: typescript

我正在尝试输入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"movecopy操作具有from属性,并且不包含其他(value除外)具有的remove属性。

很显然,我可以将fromvalue设置为可选,然后继续生活,但是我失去了验证方面,因此我想知道是否有可能(如果不是很容易)定义遵循模式的类型。

1 个答案:

答案 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

Playground Link