【问题标题】:Conditonal typescript type property based on another property's value基于另一个属性值的条件打字稿类型属性
【发布时间】:2019-11-14 01:33:44
【问题描述】:

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

显然,我可以将 fromvalue 设为可选并继续我的生活,但我失去了验证方面,所以我想知道是否有可能(如果不是很容易)定义遵守的类型架构。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您正在寻找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

    【讨论】:

    • 这是正确答案;这种类型称为“可区分联合”或“标记联合”,因为op 属性可用于测试(并缩小)对象具有的联合分支。
    • 有趣。这对你来说是不是有点“蛮力”的感觉?例如,我们是否可以将OperationType 定义为字符串操作的联合类型并以某种方式使用它?还是太花哨会让人看不懂?
    • @icfantv 我认为唯一可能的简化是最后一个可以合并的案例:typescriptlang.org/play/#code/…
    • @icfantv 只是注意到test 也具有相同类型的相同成员,因此也可以将 taht 添加到最后一个案例中.. 但我认为应该是这样 ..
    • 是的,好的。我想也许我只是想多了。偏向于行动。继续。谢谢大家!。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2021-05-16
    • 2014-04-19
    • 1970-01-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多