我有一个可空数字数组,如下所示:
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。我可以想到两种可能的解决办法,这两种方法都不是理想的:
let myArray : Array<number | null> = [1,2,null,4,null,5];
//@ts-ignore
let maximumOfMyArray = Math.max(...myArray); 这并不能真正解决问题,而且:
let myArray : Array<number | null> = [1,2,null,4,null,5];
let castArray = myArray as unknown as Array<number>;
let maximumOfMyArray = Math.max(...myArray); 有没有不使用这些解决方案的解决方案?
发布于 2021-04-20 07:58:19
有没有不使用这些解决方案的解决方案?
是的:通过null显式地将0转换为map
let maximumOfMyArray = Math.max(...myArray.map(v => v === null ? 0 : v));除非您将null映射到数字(或者过滤掉它们,如下所示),否则您唯一的其他选择是--一个解决方法,如您展示的方法,因为您要求TypeScript忽略null不是数字这一事实,而打字本存在的全部原因是不喜欢这种类型。:-)
我很遗憾地看到,如果没有类型断言(即使使用filter),null的输出并不能使TypeScript感到高兴,但至少可以让您在没有unknown的情况下进行类型断言。
const myArrayWithoutNulls = myArray.filter(v => v !== null) as Array<number>;
let maximumOfMyArray = Math.max(...myArrayWithoutNulls);发布于 2021-04-20 08:51:57
可以使用类型保护筛选数组。
declare const ns: Array<number | null>
declare const isDefined: <A>(a: A | null | undefined) => a is A
Math.max(...ns.filter(isDefined)) // number发布于 2021-04-20 08:40:48
@T.J.Crowder建议的另一种方法是扩展Math.max的定义,以包括null值,这样您的原始代码就可以正常工作了。
在.d.ts文件中添加以下内容:
declare global {
interface Math {
max(...values: (number | null)[]): number
}
}https://stackoverflow.com/questions/67174676
复制相似问题