我从TypeScript调用D3的extent函数。由于我正在处理数字,因此其返回类型为[number, number] | [undefined, undefined]
。
在[undefined,undefined]
我最终编写了一个辅助函数:
import { extent } from 'd3-array';
...
/**
* Provides a safe [0, 0] default for potentially undefined value pairs.
*/
export const safe = ([x, y]: [number, number] | [undefined, undefined]): [number, number] => {
if (x === undefined || y === undefined) {
return [0, 0];
} else {
return [x, y] as [number, number];
}
};
const safeExtent = safe(extent(values));
但我正在寻找一种更优雅/惯用的方式,与Option(extent).getOrElse([0, 0])
一样。
答案 0 :(得分:1)
我不知道基于数组值处理某种定义状态的本机TypeScript / JavaScript函数。在包含正好两个值的数组上调用reduce函数是不必要的。
我会这样做:
export function safe([x, y]: [number|undefined, number|undefined]): [number, number] {
return (x === undefined || y === undefined) ? [0, 0] : [x, y];
}
试验:
// = [0, 0]
safe([undefined, 1])
// = [0, 0]
safe([1, undefined])
// = [0, 0]
safe([undefined, undefined])
// = [1, 1]
safe([1, 1])
// = [null, null]
safe([null, null])
旁注:我更喜欢在函数类型文字(lambda概念)上导出函数声明,但我认为这是一个品味问题。
但是,在类中使用函数与const lambdas确实有所不同,因为 this 被定义为const lambda成员中的类实例。
如果函数声明了返回类型,我认为 as 不需要在返回类型上调用。
更新:您还可以使用类型声明:
export type numberOpt = number | undefined;
export function safe([x, y]: [numberOpt, numberOpt]): [number, number] {
return (x === undefined || y === undefined) ? [0, 0] : [x, y];
}
然而,这意味着再出口一次。
更新2:更好,因为更通用,因此更接近您的问题:
export type Option<T> = T | undefined;
export function safe([x, y]: [Option<number>, Option<number>]): [number, number] {
return (x === undefined || y === undefined) ? [0, 0] : [x, y];
}
答案 1 :(得分:0)
这会有用吗?
type optionalNumber = number | undefined
export const safe = ([x, y]: [optionalNumber, optionalNumber]): [
number,
number
] => {
return [x, y].map(num => num || 0)
}
更新1
在我对问题的误解和你在评论中的解释之后,我只能想出以下内容:
export const safe = ([x, y]: [number, number] | [undefined, undefined]): [
number,
number
] => {
return [x, y].map(num => num || 0) as [number, number]
}
I see .map() takes away the tuple-ness of the tuple
鉴于输入的同质性,它的工作原理和imo看起来更干净,但我不知道这是否是最惯用的方式。