【问题标题】:Cartesian product works well in JavaScript but not in TypeScript笛卡尔积在 JavaScript 中效果很好,但在 TypeScript 中效果不佳
【发布时间】:2020-08-01 18:31:08
【问题描述】:

如果有这个用于生成任意数量数组的笛卡尔积的实用程序代码:

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.

我发现this answer 指出扩展运算符仅在所有参数都标记为可选时才有效。

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

我该如何解决这个问题?

【问题讨论】:

  • 您必须输入abc
  • 请注意,我们更喜欢这里的技术写作风格。我们轻轻地劝阻问候,希望你能帮助,谢谢,提前感谢,感谢信,问候,亲切的问候,签名,请你能帮助,聊天材料和缩写 txtspk,恳求,你多久了被卡住、投票建议、元评论等。只需解释您的问题,并展示您尝试过的内容、预期的内容以及实际发生的情况。
  • 这里的主要问题是您不能将休息参数设为可选。休息参数已经暗示是可选的。在必需/可选参数(甚至没有)之后提供的参数都由该其余参数进行整理和表示。因此,如果您执行cartesian(var1, var2),那么您的函数中的c 将等于一个空数组[]。通过将可选运算符放在您的 rest 参数之后,您将其类型设置为 (Inferred/stated type) | undefined 并且您不能传播非数组类型:...undefined 将永远无法工作。 ...[undefined] 确实如此。
  • 嗨@NoamManos。据我所知,我的编辑在这里做得很好。如果您想讨论它,请在此处 ping 我,或打开一个聊天室。我有相当程度的信心,社区和模组支持改进技术写作的编辑。我总是很高兴听到其他观点。

标签: javascript typescript


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2020-09-26
    • 2017-05-24
    • 2020-05-02
    相关资源
    最近更新 更多