数组或未定义或默认数组作为函数的参数

Either Array or undefined or default array as argument to function

我想选择性地将数组传递给函数或将数组设置为默认值。

这是典型的方式: function myfunc(...values : Array<number>)

我知道我可以这样做,但我不知道如何设置它以允许此函数调用:

myfunc()
myfunc(1)
myfunc(1,2)
myfunc([1, 2])

以上,除了 myfunc() 之外的所有都被支持。我怎样才能做到?

能不能简单的这么用!!!

function a(k = []) {
    console.log(k)
}

a();
a(1);
a([1]);
a([1, 2, 3]);

这里是:

function myfunc(...values : Array<number> | [Array<number>]) {}

myfunc()
myfunc(1)
myfunc(1,2)
myfunc([1, 2])

myfunc('invalid')
myfunc([1, 2], [3, 4])

这是一个preview,您可以在其中查看结果。

您可以定义两个重载,然后在单个函数中指定逻辑。像下面这样的东西应该可以工作。

function myfunc(...values : Array<number>): number;
function myfunc(values : Array<number>): number;

function myfunc(value : (Array<number> | number), ...values : Array<number>): number {
    if (typeof value === 'number') {
        values.unshift(value);
    } else if (value === undefined) {
        values = [];
    } else {
        values = value;
    }

    // logic

    return values.length;
}

myfunc(); // correct
myfunc(1); // correct
myfunc(1, 2); // correct
myfunc([1, 2]); // correct
myfunc(1, 2, 3, 4); // correct
myfunc([1, 2, 3]); // correct
// myfunc([1, 2, 3, 4], 5, 6); // error
// myfunc([1, 2], [3, 4]); // error

console.log(myfunc(1, 2, 3)) // 3
console.log(myfunc([1, 2, 3])) // 3

请注意,因为我们没有为后跟值的数组定义接口,所以最后一个示例导致错误,我认为这是预期的行为。可以看到一个例子here。我们必须在这里检查未定义,因为转译后的 JavaScript 没有考虑不同的函数重载,而是提供了一个单独的实现,其中 value 可以是未定义的。