如何检查数组是否为数字类型并允许+运算符

时间:2019-09-26 13:13:20

标签: typescript typescript-generics

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

  

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

如何通过两种方式正确检查Tnumber

  • 在没有获得运算符'+'的情况下,prev + curr是否可以应用
  • 返回得到的number,而没有得到类型'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 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:1)

一般情况下,<lvc:CartesianChart Margin="20" Series="{Binding SeriesCollection}" LegendLocation="Left"> <lvc:CartesianChart.SeriesColors> <lvc:ColorsCollection> <Color>Green</Color> </lvc:ColorsCollection> </lvc:CartesianChart.SeriesColors> <lvc:CartesianChart.AxisX> <lvc:Axis Title="Salesman" Labels="{Binding Labels}"></lvc:Axis> </lvc:CartesianChart.AxisX> <lvc:CartesianChart.AxisY> <lvc:Axis Title="Sold Apps" LabelFormatter="{Binding Formatter}"></lvc:Axis> </lvc:CartesianChart.AxisY> </lvc:CartesianChart> 的总和不必为T[],例如:

T

很显然,type P = 1|2|3; let ps: P[] = [1,2,3,1,2,3]; 不再是sum(ps)

我认为您的示例是重载而不是泛​​型的用例:

P

此编译没有问题。

Play