用TypeScript编写求和函数

用TypeScript编写求和函数,typescript,typeerror,Typescript,Typeerror,EDIT:当然还有其他sum函数的实现,特别是一些没有出现问题的实现,但我的问题实际上是关于这个具体的实现。 TypeScript中的以下函数计算数字数组的和: function sum(list: number[]): number { if (list.length > 0) { const el: number = list[list.length - 1]; list.pop(); const s = sum(list);

EDIT:当然还有其他sum函数的实现,特别是一些没有出现问题的实现,但我的问题实际上是关于这个具体的实现。

TypeScript中的以下函数计算数字数组的和:

function sum(list: number[]): number {
    if (list.length > 0) {
        const el: number = list[list.length - 1];
        list.pop();
        const s = sum(list);
        return s + el;
    } else {
        return 0;
    }
}
这样写会更方便:

function sum(list: number[]): number {
    if (list.length > 0) {
        const el: number = list.pop();
        const s = sum(list);
        return s + el;
    } else {
        return 0;
    }
}
这会产生类型错误:

Type 'number | undefined' is not assignable to type 'number'.
这是因为,当列表为空时,
list.pop()
未定义。但由于if条件,该行中的列表不是空的。为什么TypeScript不认识到这一点?当我用
if(list.pop())
if(list.pop()!==未定义)
替换if条件时,会出现相同的错误


如何以最优雅的方式解决此问题?

您只需添加非空断言运算符即可解决此问题

函数和(列表:number[]):number{
如果(list.length>0){
常量el:number=list.pop()!;
常数s=总和(列表);
返回s+el;
}否则{
返回0;
}
}

这使TypeScript能够将其转换为
编号
,而不是
编号|未定义
。对编译器来说,这只是意味着这不会是
未定义的
空的
,您只需添加非空断言操作符即可解决此问题

函数和(列表:number[]):number{
如果(list.length>0){
常量el:number=list.pop()!;
常数s=总和(列表);
返回s+el;
}否则{
返回0;
}
}

这使TypeScript能够将其转换为
编号
,而不是
编号|未定义
。对编译器来说,这只是意味着这不会是
未定义的
空的
我建议使用一个简单的迭代函数:

function sum(list: number[]): number {
  let result: number = 0;
  for (let i=0; i<list.length; i++) {
      result += list[i];
  }
  return result;
}
函数和(列表:number[]):number{
让结果为:数字=0;

对于(设i=0;i我建议使用一个简单的迭代函数:

function sum(list: number[]): number {
  let result: number = 0;
  for (let i=0; i<list.length; i++) {
      result += list[i];
  }
  return result;
}
函数和(列表:number[]):number{
让结果为:数字=0;

对于(设i=0;i这是TypeScript中已知的设计限制。即使在条件语句中设置了类似类型保护的数组长度检查,TS也不会推断
Array.prototype.pop
的类型

有关参考信息,请参阅github

一个解决方案,如果您确定您正在做什么,您可以使用类型断言来显式地设置值的类型

const数组=[1,2,3,4,5]
如果(array.length>0){
const el=array.pop()作为数字;
}
现在来看第二期
Array.prototype.pop
将改变原始数组。例如,如果使用
.pop()删除最后一个元素
从函数中作为参数传递的数组中,最后一个元素将从数组中永久删除,如果程序的其他部分需要数组正常工作,则会导致一些严重错误

const数组=[1,2,3,4,5]
函数removeLast(列表){
list.pop();
}
removeLast(array)//将变异数组

console.log(array)
这是TypeScript中已知的设计限制。即使在条件语句中设置了类似类型保护的数组长度检查,TS也不会推断
array.prototype.pop的类型

有关参考信息,请参阅github

一个解决方案,如果您确定您正在做什么,您可以使用类型断言来显式地设置值的类型

const数组=[1,2,3,4,5]
如果(array.length>0){
const el=array.pop()作为数字;
}
现在来看第二期
Array.prototype.pop
将改变原始数组。例如,如果使用
.pop()删除最后一个元素
从函数中作为参数传递的数组中,最后一个元素将从数组中永久删除,如果程序的其他部分需要数组正常工作,则会导致一些严重错误

const数组=[1,2,3,4,5]
函数removeLast(列表){
list.pop();
}
removeLast(array)//将变异数组

console.log(数组)
这并不能直接回答您的问题,但我认为最好使用
数组。reduce
用于此目的。@wentjun当然还有求和函数的其他实现,特别是一些没有出现问题的实现,但我的问题实际上是关于这个特定的实现。这并不能直接回答您的问题在上,但我认为最好使用
Array.reduce
。@wentjun当然还有其他sum函数的实现,特别是一些没有出现问题的实现,但我的问题实际上是关于这个特定的实现。当然还有其他sum函数的实现,特别是一些问题并没有出现,但我的问题是关于这个特定的函数。当然还有其他的求和函数的实现,特别是一些没有出现问题的函数,但我的问题是关于这个特定的函数。这非常有用,谢谢!这是参考:这非常有用,谢谢!这是参考e:谢谢,作为数字的部分很有用。谢谢,作为数字的部分很有用。