typescript 无法使用动态运算符正确键入JSON逻辑

r7xajy2e  于 2023-08-08  发布在  TypeScript
关注(0)|答案(1)|浏览(91)

我正在使用json-logic-js的绝对类型包。
当我使用动态操作符时,我似乎无法让TypeScript编译,但如果我使用静态操作符,它就可以正常工作。这个方法的作用是:

const staticRule: RulesLogic = {
  '==': [{var:'one'},1]
}

字符串
但这并不是:

const op: ReservedOperations[] = ['==','>=','<=','===']

const dynamicOperator = op[1]

const dynamicRule: RulesLogic = {
  [dynamicOperator]: [{var:'one'},1]
}


我得到错误:

Type '{ [x: string]: (number | { var: string; })[]; }' is not assignable to type 'RulesLogic<never>'.
  Property 'log' is missing in type '{ [x: string]: (number | { var: string; })[]; }' but required in type 'JsonLogicLog<never>'.


这是一个TypeScript的Playground。
即使我只指定这两个操作符,它仍然不起作用:

const createRulesLogic = (operation: '==' | '!='): RulesLogic => ({
  [operation]: [{var:'one'},1]
})


导致错误:

Type '{ [x: string]: (number | { var: string; })[]; }' is not assignable to type 'RulesLogic<never>'.
  Property 'log' is missing in type '{ [x: string]: (number | { var: string; })[]; }' but required in type 'JsonLogicLog<never>'.


Playground链接

ru9i0ody

ru9i0ody1#

staticRule被自动识别为有效的RulesLogic,特别是JsonLogicEqual,因为您显式地将运算符/ket设置为==
“动态”规则并不事先知道您将使用哪个操作符,并警告您,如果动态操作符是log,则您的规则将缺少对象中的log键。

相关问题