TypeScript数组通用丢失顺序

TypeScript数组通用丢失顺序,typescript,Typescript,我有一个函数,它接收一个数组([a,b])作为它的第二个参数。我们不知道它的类型,在函数中,所以我们为它创建了一个泛型 数组传递给该函数中的回调函数 稍后在回调中使用时,数组将丢失其排序类型。TypeScript认为数组可以是[b,a]也可以是[a,b],因为它的泛型是(a | b)[],而不是[a,b] 可以通过将类型传递给函数来覆盖泛型,但我希望避免这种情况 两个console.logs给出了类型错误。如何创建一个尊重数组顺序的泛型 下面的代码在中运行 函数useOnChange(回调:(o

我有一个函数,它接收一个数组([a,b])作为它的第二个参数。我们不知道它的类型,在函数中,所以我们为它创建了一个泛型

数组传递给该函数中的回调函数

稍后在回调中使用时,数组将丢失其排序类型。TypeScript认为数组可以是[b,a]也可以是[a,b],因为它的泛型是(a | b)[],而不是[a,b]

可以通过将类型传递给函数来覆盖泛型,但我希望避免这种情况

两个console.logs给出了类型错误。如何创建一个尊重数组顺序的泛型

下面的代码在中运行

函数useOnChange(回调:(oldValue:Dependencies)=>void,Dependencies:Dependencies){
回调(依赖项);
}
常量a={test:“某物”}
常量b={test2:“else”}
useOnChange(([a,b])=>{
//I数组通过其在数组中的索引销毁参数
//因此a==a和b==b。
//但是TypeScript认为(我们破坏的)参数是(a | b)[],而不是[a,b]。
//换句话说:它认为它可以是[b,a]也可以是[a,b]。它忽略了数组的顺序。
console.log(a.test);
console.log(b.test2);
},[a,b])
//这是可行的,但我相信它应该在没有
useOnChange(([a,b])=>{
console.log(a.test);
console.log(b.test2);
},[a,b])

通用rest应该可以做到这一点。解释如下:

函数useOnChange(回调:(oldValue:[…T])=>void,依赖项:[…T]){
回调(依赖项);
}
常量a={test:“某物”}
常量b={test2:“else”}
useOnChange(([a,b])=>{
console.log(a.test);
console.log(b.test2);
},[a,b])

哦,非常感谢!我从来不知道这种传播。它就像一个符咒。
function useOnChange<T extends unknown[]>(callback: (oldValue: [...T]) => void, dependencies: [...T]) {
  callback(dependencies);    
}

const a = { test: "something"}
const b = { test2: "else" }

useOnChange(([a,b]) => {
  console.log(a.test);
  console.log(b.test2);
}, [a,b])