构建和输入丰富的搜索对象

问题描述 投票:0回答:1

背景

我正在构建一个 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
属性。

  1. 属性名称取自输入
    keywords
    ranges
    。我搜索并找到了一种基于简单映射重命名属性的类型,但它不起作用。理想情况下,最终的属性名称将得到反映,这样我就不必将它们重命名两次。
  2. 属性名称当前不会自动完成。我确实有一个名称会自动完成的版本,但建议是基于
    keywords
    ranges
    ,而不是实际可用的。
  3. 属性值全部键入为
    unknown
    。我希望通过
    releaseConditions
    实际返回的内容来推断这些。
  4. 应输入
  5. releaseConditions
    来要求
    include
    exclude
    属性。如果必须指定显式属性重命名类型参数,它应该有助于告知这两个属性的名称。

目前我能想到的就这些了。今天我已经把它提炼了好几天好几个小时了,我的脑子已经炸了。如果您有任何疑问,我很乐意回答。谢谢!

typescript next.js
1个回答
0
投票

我创建了一个新的游乐场,它展示了我想要的一切。属性名称可按表单自定义。当使用最终对象时,我在

SEACH_QUERY
releaseInclude
以及外部获得完整的类型安全和自动完成。

© www.soinside.com 2019 - 2024. All rights reserved.