我正在构建一个 Next 应用程序,它将具有许多高级搜索表单。我找到了一个库来帮助构建简单和高级查询:
search-query-parser
。 search-query-parser
会将像 const input = "foo bar -baz answer:42"
这样的输入字符串转换为像 const output = { text: ["foo", "bar"], answer: [ "42" ], exclude: { text: [ "baz" ] } }
这样的对象(加上一些其他属性)。 search-query-parser
允许将关键字和范围指定为字符串数组。这些将用于帮助构建输出对象。我也在用zod
。
我正在将此输出对象转换为完全类型化的对象,该对象可以针对不同的搜索表单进行自定义。最终对象将具有一些用于管理分页和呈现格式的通用属性。它还将包含原始输入字符串以及从搜索字符串中提取的完全解析和键入的条件。
我已将一些相关代码复制到playground中。代码的底部是一些类型检查。根据
console.log
,我的应用程序中的运行时行为实际上是正确的。 releaseQuery
是我正在尝试构建的搜索对象类型的示例。 releaseQuery.conditions.include
和releaseQuery.conditions.exclude
的具体形状会根据配置和实际输入而有所不同。
我在输入最终输出对象时遇到问题,特别是关于
releaseQuery.conditions.include
属性。
keywords
和 ranges
。我搜索并找到了一种基于简单映射重命名属性的类型,但它不起作用。理想情况下,最终的属性名称将得到反映,这样我就不必将它们重命名两次。keywords
和 ranges
,而不是实际可用的。unknown
。我希望通过 releaseConditions
实际返回的内容来推断这些。releaseConditions
来要求 include
和 exclude
属性。如果必须指定显式属性重命名类型参数,它应该有助于告知这两个属性的名称。目前我能想到的就这些了。今天我已经把它提炼了好几天好几个小时了,我的脑子已经炸了。如果您有任何疑问,我很乐意回答。谢谢!