【问题标题】:function rest parameter and generic函数剩余参数和泛型
【发布时间】:2020-06-09 03:31:01
【问题描述】:

我的迭代中有以下错误

运算符 '+=' 不能应用于类型 'number' 和 'T'。

我不知道为什么

let a: number = 1, b: number = 2, c: number = 3, d: number = 4;
function somme<T>(...nombres: T[]): T {
  let s: number = 0;

  for (let nombre of nombres) {
    s += nombre;
  }
  return s;
}

console.log(a + `  + ` + b + ` = ` + somme<number>(a, b));
// 1 + 2 = 3
console.log(a + `  + ` + b + `  + ` + c + `  = ` + somme<number>(a, b, c));
// 1 + 2 + 3 = 6
console.log(a + `  + ` + b + `  + ` + c + `  + ` + d + `  = ` + somme<number>(a, b, c, d));
// 1 + 2 + 3 + 4 = 10

感谢您的帮助

【问题讨论】:

  • 你为什么在这里使用泛型?如果参数的类型不是数字怎么办?
  • 我认为我们应该为所有函数使用泛型

标签: typescript function loops generics iterator


【解决方案1】:

您有一个错误,因为 + 运算符仅限于两种主要类型 string 和 number,您只能将其用于这两种类型或 1 或 abc 等子类型。在您的情况下,您只想使用 number 类型(您有这种类型的本地 s),我建议删除泛型类型,因为此函数始终适用于数字:

function somme(...nombres: number[]): number {
  let s: number = 0;

  for (let nombre of nombres) {
    s += nombre;
  }
  return s;
}

最终你可以保持通用(仍然看不到任何理由),但不能用于 return,因为 return 是一个总和,而不是你作为参数得到的数字:

function somme<T extends number>(...nombres: T[]): number {
  let s: number = 0;

  for (let nombre of nombres) {
    s += nombre;
  }
  return s;
}

你不能有返回类型T,因为这意味着如果你说T = 1,那么返回将是1,实际上将是给定参数数组中所有1值的总和,所以总和将是T * arr['length'],并且这种类型在 TS 中是不可能的,因为没有类型算术运算之类的东西。

【讨论】:

  • 谢谢 Maciej,您的代码运行良好,感谢您的解释。
猜你喜欢
  • 1970-01-01
  • 2021-03-01
  • 2021-11-15
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多