【问题标题】:How to make Array.reduce work with TypeScript tuple如何使 Array.reduce 与 TypeScript 元组一起使用
【发布时间】:2020-11-20 10:38:42
【问题描述】:

我下面的代码示例是一个对给定数组中的每个数字进行四舍五入的化简器。

type Values = [number, number];

export function roundValues(input: Values): Values {
  return input.reduce((all, current) => [...all, current], []);
}

但是,它给出了错误TS2322: Type 'number' is not assignable to type 'Values'。知道如何使这个减速器与适当的类型一起工作吗?

在切换到元组类型之前,我之前的代码看起来像下面的代码示例。我不确定它是否正确实现,因为我是 TypeScript 的新手,但它从来没有给我任何错误。我希望 number[][number, number] 类型基本相同(除了它们可能的长度)并且不会在这里造成任何问题。

type Values = number[];

export function roundValues(input: Values): Values {
  return input.reduce<Values>((all, current) => [...all, current], []);
}

【问题讨论】:

  • 问题是很难隐式输入。您确定要通过.reduce 执行此操作吗?因为听起来您只想对每个值进行操作,所以.map 是惯用的选择并且它应该正确处理类型而不需要任何东西。
  • 您的代码不符合元组的规则:Type '[number, number, number]' is not assignable to type 'Values'. Source has 3 element(s) but target allows only 2。你最好按照 VLAZ 的建议使用map
  • @VLAZ @entiendoNull 是的,你是对的,它应该是map。它曾经删除条目,但现在不再。但是,我仍然遇到同样的问题,并且无法让 Array.map 使用元组并获得完全相同的错误消息。能否请您提供一个代码示例?

标签: javascript typescript tuples


【解决方案1】:

您可以使用 map 函数来代替您在 cmets 中提到的 reduce

map 总是返回一个大小不定的数组。 您必须再次将返回值转换为元组。因为它是一个地图函数,所以我认为这是一个保存类型转换。

type Values = [number, number];
export function roundValues(input: Values) {
  return input.map((value) => Math.round(value)) as Values;
}

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 2016-08-27
    • 2019-07-31
    • 2020-04-16
    • 2020-04-04
    • 2019-03-19
    • 1970-01-01
    • 2020-03-02
    • 2020-05-22
    相关资源
    最近更新 更多