параметр остальных функции и общий - PullRequest
0 голосов
/ 25 февраля 2020

у меня есть следующая ошибка в моей итерации

Оператор '+ =' не может быть применен к типам 'number' и 'T'.

i don ' Нет, почему

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

Спасибо за помощь

1 Ответ

1 голос
/ 25 февраля 2020

У вас есть ошибка, потому что оператор + ограничен для двух основных типов string и number, вы можете использовать его только для этих двух или подтипов, таких как 1 или abc. В вашем случае видимым вы хотите работать только с типом number (у вас есть локальный s этого типа), я предлагаю удалить тип generi c, потому что эта функция всегда работает с числами:

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

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

В конце концов вы можете сохранить generi c (все еще не вижу причин), но не для возврата, поскольку 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, тогда return будет иметь значение 1, и в действительности будет суммой всех значений 1 в заданном в качестве аргумента массиве, поэтому сумма будет T * arr['length'] и такой тип невозможен в TS, потому что нет такой вещи как операции типа арифмети c.

...