首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用扩展运算符在TypeScript中求可空数数组的最大值

使用扩展运算符在TypeScript中求可空数数组的最大值
EN

Stack Overflow用户
提问于 2021-04-20 07:52:40
回答 3查看 470关注 0票数 2

我有一个可空数字数组,如下所示:

代码语言:javascript
运行
复制
let myArray : Array<number | null> = [1,2,null,4,null,5];
let maximumOfMyArray = Math.max(...myArray); // Type null is not assignable to type number

在这种情况下,我很高兴JavaScript将null处理为0。我可以想到两种可能的解决办法,这两种方法都不是理想的:

代码语言:javascript
运行
复制
let myArray : Array<number | null> = [1,2,null,4,null,5];
//@ts-ignore
let maximumOfMyArray = Math.max(...myArray); 

这并不能真正解决问题,而且:

代码语言:javascript
运行
复制
let myArray : Array<number | null> = [1,2,null,4,null,5];
let castArray = myArray as unknown as Array<number>;
let maximumOfMyArray = Math.max(...myArray); 

有没有不使用这些解决方案的解决方案?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-04-20 07:58:19

有没有不使用这些解决方案的解决方案?

是的:通过null显式地将0转换为map

代码语言:javascript
运行
复制
let maximumOfMyArray = Math.max(...myArray.map(v => v === null ? 0 : v));

操场链接

除非您将null映射到数字(或者过滤掉它们,如下所示),否则您唯一的其他选择是--一个解决方法,如您展示的方法,因为您要求TypeScript忽略null不是数字这一事实,而打字本存在的全部原因是不喜欢这种类型。:-)

我很遗憾地看到,如果没有类型断言(即使使用filter),null的输出并不能使TypeScript感到高兴,但至少可以让您在没有unknown的情况下进行类型断言。

代码语言:javascript
运行
复制
const myArrayWithoutNulls = myArray.filter(v => v !== null) as Array<number>;
let maximumOfMyArray = Math.max(...myArrayWithoutNulls);

操场链接

或者更好地做到这一点,在他们的回答中使用类型保护函数作为丹尼斯·弗雷扎托

票数 2
EN

Stack Overflow用户

发布于 2021-04-20 08:51:57

可以使用类型保护筛选数组。

代码语言:javascript
运行
复制
declare const ns: Array<number | null>
declare const isDefined: <A>(a: A | null | undefined) => a is A

Math.max(...ns.filter(isDefined)) // number
票数 3
EN

Stack Overflow用户

发布于 2021-04-20 08:40:48

@T.J.Crowder建议的另一种方法是扩展Math.max的定义,以包括null值,这样您的原始代码就可以正常工作了。

.d.ts文件中添加以下内容:

代码语言:javascript
运行
复制
declare global {
  interface Math {
    max(...values: (number | null)[]): number
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67174676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档