Cartesian产品在JavaScript中运行良好,但在TypeScript中不起作用

Cartesian产品在JavaScript中运行良好,但在TypeScript中不起作用,javascript,typescript,Javascript,Typescript,如果您有以下用于生成任意数量数组的笛卡尔积的简短实用程序代码: const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e)))); const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a); 例如: console.log(cartesian([1, 2, 3], [4, 5])); 给出: [ [ 1, 4

如果您有以下用于生成任意数量数组的笛卡尔积的简短实用程序代码:

const f = (a, b) => [].concat(...a.map(d => b.map(e => [].concat(d, e))));
const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);
例如:

console.log(cartesian([1, 2, 3], [4, 5]));
给出:

[ [ 1, 4 ], [ 1, 5 ], [ 2, 4 ], [ 2, 5 ], [ 3, 4 ], [ 3, 5 ] ]
但当我尝试将其从JavaScript移植到TypeScript时,会出现以下错误:

error TS2557: Expected at least 2 arguments, but got 1 or more.

const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);
                                                          ~~~~
const cartesian = (a, b, ...c) => (b ? cartesian(f(a, b), ...c) : a);
                      ~
An argument for 'b' was not provided.
我发现,只有当所有参数都标记为可选时,spread操作符才起作用

但我不确定如何在我的代码中应用它(
…c?
似乎不起作用),老实说,我甚至不确定这是正确的解决方案


如何解决此问题?

已解决-问号应应用于第二个参数:

const cartesian = (a, b?, ...c) => (b ? cartesian(f(a, b), ...c) : a);

您必须键入
a
b
c
。请注意,我们更喜欢这里的技术风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,闲聊的材料和缩写的txtspk,恳求,你被困多久了,投票建议,元评论等。只需解释你的问题,并展示你已经尝试了什么,你期望什么,这里的主要问题是,不能将rest参数设置为可选的。Rest参数已经暗示为可选参数。在必需/可选参数(甚至无)之后提供的参数都由该rest参数进行整理和表示。因此,如果执行笛卡尔(var1,var2),那么函数中的
c
将等于一个空数组,
[]
。通过将可选运算符放在rest参数之后,您将其类型设置为
(推断/声明类型)|未定义的
,并且无法扩展非数组类型:
…未定义的
将永远无法工作<代码>…[undefined]确实如此。嗨@NoamManos。据我所知,我的编辑是一个很好的在这里。如果你想讨论这个问题,请在这里和我联系,或者开个聊天室。我有相当程度的信心,社区和mods支持编辑以改进技术写作。我总是乐于听到其他观点。