1

在下面的代码中,我收到以下错误previous + current

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

我怎样才能正确地检查这Tnumber我可以两者兼得的方式:

  • 没有prev + curr得到运算符'+'就不能应用吗?
  • 返回结果number,没有得到Type 'number' is notassignable to type 'T'
function sum<T>(values: T[]): T {
  switch (typeof values[0]) {
    case 'number':
      return values.reduce((prev, curr) => prev + curr, 0);
    default:
      return null;
  }
}
4

2 回答 2

1

这不会给你你提到的类型错误。但是我们必须为此使用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;
  }
}
于 2019-09-26T13:43:23.550 回答
1

在一般情况下,总和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;
}

这编译没有问题。

于 2019-09-26T17:10:35.827 回答