是否可以通过这种方式为可选参数重载Typescript函数?

时间:2020-06-10 19:16:03

标签: typescript overloading destructuring

我认为对此的答案可能是没有办法做到这一点,因为我还没有弄清楚如何使其起作用,但这是我想做的。假设我有一个函数,它接受3个数字,最后两个是可选的。我想允许将可选参数作为它们自己的参数提供,或者组合成每个参数都是可选的对象。

这种事情已经尽我所能,但是解构却行不通:

function add(a: number, b?: number, c?: number): number;
function add(a: number, {b, c}: {b?: number, c?: number}): number;
function add(a: number, b?: any, c?: number): number {
    return a + (b ? b : 0) + (c ? c : 0);
}
console.log('a + b + c: ' + add(3, undefined, 8));
console.log('a + b + c: ' + add(3, {c: 8}));
a + b + c: 11
a + b + c: 3[object Object]0

实际用例是一种具有很多参数的方法,我们希望保持向后兼容,但在调用时为了简单起见希望添加对象的种类。

1 个答案:

答案 0 :(得分:0)

重载呼叫签名和类型注释是TypeScript静态类型系统的一部分,当TypeScript代码转换为JavaScript时,该类型为erased

这意味着您的add()函数在实际运行时会变成以下函数:

// transpiled
function add(a, b, c) {
    return a + (b ? b : 0) + (c ? c : 0);
}

如您所见,那里没有破坏。如果希望bc来自参数对或单个对象,则需要该逻辑在函数实现中发生。这是我的写法:

function add(a: number, b?: number, c?: number): number;
function add(a: number, { b, c }: { b?: number, c?: number }): number;
function add(a: number, p1?: number | { b?: number, c?: number }, p2?: number): number {
    const b = typeof p1 === "object" ? p1.b : p1;
    const c = typeof p1 === "object" ? p1.c : p2
    return a + (b || 0) + (c || 0);
}

实现签名具有名为p1p2的参数,它们是来自调用add()的可能方式的类似参数的并集。然后,我们必须根据bc计算p1p2。这应该可以按照您期望的方式工作:

console.log('a + b + c: ' + add(3, undefined, 8)); // 11
console.log('a + b + c: ' + add(3, { c: 8 })); // 11

好的,我希望能有所帮助;祝你好运!

Playground link to code