在下面的代码中,我在previous + current
上遇到以下错误:
运算符'+'不能应用于类型'number'和'T'。
如何通过两种方式正确检查T
是number
:
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;
}
}
答案 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
此编译没有问题。