【问题标题】:How to check if array is of type number and allow + operator如何检查数组是否为数字类型并允许 + 运算符
【发布时间】:2020-01-26 18:44:15
【问题描述】:

在下面的代码中,previous + current 出现以下错误:

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

我怎样才能正确地检查Tnumber,我可以两者兼得:

  • 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;
  }
}

【问题讨论】:

  • @Estradiaz 我知道自定义类型保护,但不知道在这种情况下如何使用。
  • 用例是什么?大多数类型没有+ 的有意义的实现。可以不约束吗?
  • 用例是一个表格组件,您可以传递一个数据对象数组和一个要显示的列数组(headerfield,以及可选的format 函数)。此外,数据将按给定的选择器(例如按年份)分组,每组都有一个“总计行”。要计算该行数据,我可以为该列传入一个自定义 sum 函数,但是我不想在简单的情况下这样做,比如列只是常规的数字。代码很好用,我只是不知道如何正确输入。

标签: typescript typescript-generics


【解决方案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;
  }
}

【讨论】:

  • 这至少可以消除类型错误,但希望有更好的方式来表达我想要的东西?
【解决方案2】:

一般情况下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;
}

这编译没有问题。

Play

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多