Как проверить, имеет ли массив тип номера и разрешить + оператор - PullRequest
1 голос
/ 26 сентября 2019

В приведенном ниже коде я получаю следующую ошибку на previous + current:

Оператор '+' нельзя применить к типам 'number' и 'T'.

Как правильно проверить, что T равно number таким образом, что я могу одновременно:

  • Выполнить prev + curr, без получения Оператор '+' не может бытьприменяется ?
  • Возвращать полученный number, не получая Тип 'номер' нельзя назначить типу 'T' ?
function sum<T>(values: T[]): T {
  switch (typeof values[0]) {
    case 'number':
      return values.reduce((prev, curr) => prev + curr, 0);
    default:
      return null;
  }
}

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Сумма T[] не обязательно должна быть T в общем случае, рассмотрим, например:

type P = 1|2|3;
let ps: P[] = [1,2,3,1,2,3];

Очевидно, sum(ps) больше не будет P.

Я думаю, что ваш пример - это пример использования перегрузок, а не генериков:

function sum(a: number[]): number;
function sum(a: any[]): null;

function sum(values: any[]): any {
    if (typeof values[0] === "number")
        return values.reduce((prev, curr) => prev + curr, 0);
    else
        return null;
}

Это компилируется без проблем.

Воспроизвести

1 голос
/ 26 сентября 2019

Это не даст вам ошибки типа, которые вы упомянули.Но для этого нужно использовать тип unknown.

function sum<T>(values: T[]): T {
  switch (typeof values[0]) {
    case 'number':
      return (values.reduce((prev, curr) => prev + <number><unknown>curr, 0)) as unknown as T;
    default:
      return null;
  }
}
...