【发布时间】:2021-10-09 19:35:06
【问题描述】:
我有一个带有 2 个参数的函数 1:对象数组和 2:一个字符串数组,是之前对象上的键
并根据它们创建分组。如何在以下递归函数中键入结果对象值any?
import { groupBy, transform } from 'lodash'
const multiGroupBy = (array: objectType[], [group, ...restGroups]: string[]) => {
if (!group) {
return array
}
const currGrouping = groupBy(array, group)
if (!restGroups.length) {
return currGrouping
}
return transform(
currGrouping,
(result: { [key: string]: any }, value, key) => {
// What do I type as the any value above
result[key] = multiGroupBy(value, [...restGroups])
},
{}
)
}
const orderedGroupRows = multiGroupBy(arrayOfObjects, ['category', 'subCategory'])
所以结果将是这样的递归结构,具体取决于字符串数组的长度
const result = {
"Category Heading 1": {
"SubCategory Heading 1": [
...arrayofOfObjects
]
},
"Category Heading 2": {
"SubCategory Heading 2": [
...arrayofOfObjects
]
}
}
Here is a codesandbox 获取代码。
【问题讨论】:
-
请考虑修改这个问题中的代码以构成一个minimal reproducible example,当它放入像The TypeScript Playground (link)这样的独立IDE中时,清楚地展示了您面临的问题,没有不相关的错误,额外代码,或缺少声明。这将使那些想要帮助您的人立即着手解决问题,而无需首先重新创建它。它将使您得到的任何答案都可以针对定义明确的用例进行测试。
-
你还没有定义
objectType,我不确定你的输出中是否需要强类型键(如果编译器知道,例如,"Category Heading 1"是result的一个键?或者如果它只知道它有一些string键而不知道它们是什么,这可以吗?) -
根据您在打字中需要多少信息,您可以使用this。如果这对你有用,我可以写一个答案;如果没有,请详细说明缺少的内容。
-
非常感谢您输入它看起来有点复杂。我已经通过上面的代码框链接添加了更多信息,并输入了 lodash 库,您可以查看更多详细信息。你能检查一下是否可以使用更简单的打字方式吗?
-
"看起来有点复杂" 是的,如果你需要一个强类型的输出,那么输入就有点复杂了。您能解释一下您希望看到来自
multiGroupBy(arrayOfObjects, ["category", "subCategory"])的返回类型吗?你不想要any,或者像object这样的微不足道的东西。下一个最简单的是type Ret = Record<string, Ret | ObjectType[]>。之后你可以拥有Record<string, Record<string, ObjectType[]>,然后你开始让编译器跟踪特定的键,比如{"Category Heading 1": {"SubCategory Heading 1": ObjectType[]}, ...}。
标签: javascript typescript lodash