// Works fine in 4.3.5, not in 4.4.2 type ArgsTupleUnion<T> = | [obj: T, x: (arg: T) => void] | [y: (arg: number) => void]; function f<T>(...args: ArgsTupleUnion<T>) {} f({ k: 15 }, (arg) => { // 4.3.5: arg is {k: number}, 4.4.2: arg is 'any' console.log(arg.k); }); f((a: number) => {}); type ArgsTuple<T> = | [obj: T, x: (arg: T) => void] // | [y: (arg: number) => void]; function f2<T>(...args: ArgsTuple<T>) {} f2({ k: 15 }, (arg) => { // Both 4.3.5 and 4.4.2: arg is {k: number} console.log(arg.k); });Aquí está el código en TS Playground. No estoy seguro de qué cambio ha hecho que esto deje de funcionar, pero me impide actualizar a 4.4. ¿Alguien más que se haya topado con esto o tenga una idea para solucionarlo?
Una posible solución sería usar sobrecarga funcional
Parece que TypeScript está optando por el número de tipo más específico en lugar de rastrear la cantidad de elementos en una matriz determinada.
type ArgsTuple<T> = [obj: T, x: (arg: T) => void]; type NumArrFun = [y: (arg: number) => void]; type ArgsTupleUnion<T> = | ArgsTuple<T> | NumArrFun; function f<T>(...args: ArgsTuple<T>): void function f<T>(...args: NumArrFun): void function f<T>(...args: ArgsTupleUnion<T>) {} f({ k: 15 }, (arg) => { // 4.3.5: arg is {k: number}, 4.4.2: arg is 'any' console.log(arg.k); }); f((a: number) => {});