您可以定义两个重载,然后在单个函数中指定逻辑。像下面这样的东西应该有效。
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 https://www.typescriptlang.org/play?#code/GYVwdgxgLglg9mABAWwJ6kgCgHS4G4CGANiAKYDOiAXIgIIBO9BqAPGCMgEan0B8AlDXZceAbgBQGaPCRopmQiQrU6jZmw7c+gxMK0TJ4aQhTojC4mRWYGTVnp69EAH12ae-ADSJc2RWUoaW3UHbSF3ekQAb3FEOMQYYERMKFQAB1I4JP9SRABeAsQAclCi-mjY+Kqc8mxwcgALRKgLJX4JKoBfRFIiclzE5Jz8wvAAE1JgGDBSMfKYqurLZTzEAG0AXQ747t7+isX4mvzEHO24zvFKuIB6G8QiOABzGAgrqvpSKBB6JBrsIikMBPKANCSXcRycztRB3RAQOCMUjQSFmLAARhhcIRSJRUIx3gATFj7jjPni0RBMGt0USNiT4YjyVBUfJaYhCd4AMzeAAsDLJyJZ+KpNKJ3PpolhpKZQvEcJF1PZnMQPMQvI23gArN4AGwMnj0RHy+6KsUczXrNUag2MY3iBFgchwQEA56YRXK7n8cpwrkOhDO12PJ4eylK8Wq+m++5coA。我们必须在这里检查未定义的情况,因为转译的 JavaScript 没有考虑不同的函数重载,而是提供了一个单一的实现,其中value
可以是未定义的。