【发布时间】:2021-09-07 01:50:47
【问题描述】:
我正在尝试创建一个函数来创建所有可能的输入参数组合,同时保持输出类型。
例如:
generateSets("string") // returns [["string"]]
generateSets(1) // returns [[1]]
generateSets("string", 1) // returns [["string", 1]]
generateSets(["string", "string2"], 1) // returns [["string", 1], ["string2", 1]]
generateSets("string", [1,2]) // returns [["string", 1], ["string", 2]]
generateSets(["string", "string2"], [1,2]) // returns [["string", 1], ["string", 2], ["string2", 1], ["string2", 2]]
基本上我想要一个动态数量的未知类型的参数(并不总是原始的),如果参数是一个数组,我想返回该参数与其他参数的所有可能组合。最重要的是,我希望返回类型与参数的顺序相匹配,例如使用字符串调用函数,然后使用数字我希望返回类型是元组数组,其中第一个元素是字符串,第二个元素是数字。
我已经尝试过这个实现,但是它强制所有输入参数都是相同的类型
export function generateArgumentSets<T>(...args: Array<T | Array<T>>): Array<Array<T>> {
const [arg1, ...rest] = args;
if (!arg1) return [];
const nested = generateArgumentSets(...rest);
if (Array.isArray(arg1))
return arg1.flatMap((arg1El) => nested.map((nestedArgs) => [arg1El, ...nestedArgs]));
return nested.map((nestedArgs) => [arg1, ...nestedArgs]);
}
我尝试了另一种方法,我想更改其他元素的类型,但首先,但这也不起作用
export function generateArgumentSets<T, T2>(...args: [T | Array<T>, ...Array<T2 | Array<T2>>]): Array<[T1, ...Array<T2>]> {
const [arg1, arg2, ...rest] = args;
if (!arg2) return Array.isArray(arg1) ? [arg1] : [[arg1]];
const nested = generateArgumentSets(arg2, ...rest);
if (Array.isArray(arg1))
return arg1.flatMap((arg1El) => nested.map((nestedArgs) => [arg1El, ...nestedArgs]));
return nested.map((nestedArgs) => [arg1, ...nestedArgs]);
}
你能指出我解决这个问题的正确方向吗?
【问题讨论】:
-
你问的是类型还是实现?因为据我所知,您的实现只返回空数组,至少在我测试它时是这样。您是否正在寻找使其输入数组成为cartesian product 的东西,将非数组输入视为单元素数组?但是您似乎专注于有关异构数组的编译器警告;这很容易解决,但是实现/算法似乎离题了。我应该把重点放在哪里?
-
我的意思是,this 你在找什么?这修复了实现和类型。如果这对你有用,我会写一个答案;如果没有,请详细说明我所缺少的。 (我可以更疯狂地使用类型,以便元组的元组变成笛卡尔积元组,但我不知道你是否真的需要)
-
HERE'S 疯狂的元组类型;可能比它的价值更多的麻烦。除非您有其他问题,否则我可能会将所有这些都写下来作为答案。
标签: javascript node.js arrays typescript