Typescript函数使用解构的rest参数重载类型推理



给定以下重载函数:

foo(tool: 'a', poaram: boolean, poarama: number): boolean
foo(tool: 'b', paramo: string, paramoa: string): boolean
foo(tool: 'a' | 'b', ...args: any[]): boolean {
if (tool === 'a') {
const [ poaram, poarama ] = args
}
return false
}

有没有办法让poarampoarama不被类型化为any,而是分别被类型化成booleannumber

我知道rest参数和spread表达式中的元组,但我看不到与上面的用例的联系。

如果允许您每晚使用TypeScript(4.6(,您可以考虑此解决方案:


function foo(...args: ['a', boolean, number] | ['b', string, string]): boolean {
const [fst, scd, thrd] = args;
if (fst === 'a') {
const x = scd; // boolean
const y = thrd // number
}
return false
}

游乐场甚至没有休息参数:


function foo([first, second, third]: ['a', boolean, number] | ['b', string, string]): boolean {
if (first === 'a') {
const x = second; // boolean
const y = third // number
}
return false
}

以上功能已添加到此处TypeScript/pull/44626

如果不允许,则应避免元组析构函数:


function foo(...args: ['a', boolean, number] | ['b', string, string]): boolean {
if (args[0] === 'a') {
const x = args[1]; // boolean
const y = args[2] // number
}
return false
}

您可以为函数的实现类型选择其中一种:

foo(tool: 'a'|'b', ...args: [boolean, number]|[string, string]): boolean { // or
foo(tool: 'a'|'b', arg1: boolean|string, arg2: number|string): boolean {

最新更新