【问题标题】:Recursive expression in typescript打字稿中的递归表达式
【发布时间】:2023-02-09 23:33:45
【问题描述】:

假设我想将一组逻辑规则存储在一个对象中:

const rule1 : Rule = {
  ">" : [3,2]
}; // Which represents : 3>2

const rule2 : Rule = {
  "and" : [
    { ">" : [3,1] },
    { "<" : [1,3] }
  ]
}; // Which represents : (3>1) && (1<3)

我这样写我的类型:

type Operand = number | string | Rule

type Operator =
  "var" |
  "===" |
  "!==" |
  "<="  |
  "<"   |
  ">="  |
  ">"   |
  "or"  |
  "and" ;

interface Rule extends Record<Operator, [Operand, Operand]> { }

但是我收到以下错误Type '{ "&gt;": [number, number]; }' is missing the following properties from type 'Record&lt;Operator, [Operand, Operand]&gt;': var, "===", "!==", "&lt;=", and 4 more.

我做错了什么?

【问题讨论】:

    标签: typescript recursion types logic


    【解决方案1】:

    interface Rule extends Record&lt;Operator, [Operand, Operand]&gt; { } 将命名任何给定规则所需的所有运算符。

    您可以扩展 Partial&lt;Record&lt;Operator, [Operand, Operand]&gt;&gt; 并将它们全部设为可选。这意味着一个规则可以指定多个运算符,这可能不是您想要的:

    interface Rule extends Partial<Record<Operator, [Operand, Operand]>> { }
    const rule1 : Rule = {
      ">" : [3, 2],
      "<" : [3, 2]
    };
    

    Playground Link

    您也可以不使用接口,而是生成一个联合,其中每个对象类型都需要一个运算符:

    type Rule<T extends Operator = Operator> =  T extends T ? Record<T, [Operand, Operand]>: never;
    

    Playground Link

    【讨论】:

      猜你喜欢
      • 2021-12-19
      • 1970-01-01
      • 2019-04-25
      • 2013-01-16
      • 1970-01-01
      • 2021-06-30
      • 2021-07-10
      • 2017-12-12
      • 2019-04-09
      相关资源
      最近更新 更多