在[undefined,undefined]的情况下,惯用TypeScript提供默认值?

时间:2018-03-13 11:59:46

标签: typescript

我从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])一样。

2 个答案:

答案 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看起来更干净,但我不知道这是否是最惯用的方式。