...args 的泛型类型?

the*_*per 4 generics types typescript

我有一个函数time

const time = <T>(fn: (...args: any[]) => Promise<T>, ...args: any[]): Promise<T> => {
  return new Promise(async (resolve, reject) => {
    const timer = setTimeout(() => reject(`Error: ${fn.name} timed out`), ms)
    try {
      resolve(await fn.bind(thisArg)(...args))
    } catch(err) {
      reject(err)
    } finally {
      clearTimeout(timer)
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

我想知道是否有办法避免使用anyas 的类型...args?具体来说,因为我想将签名 ( )...args中的类型与(函数的第二个参数)的类型相关联。这两个是相同的参数,所以看起来它们应该通过泛型相关。我想到了这样的事情:fnfn: (...args: any[]) => Promise<T>...argstime...args

const time = <T, U>(fn: (...args: U[]) => Promise<T>, ...args: U[]): Promise<T>
Run Code Online (Sandbox Code Playgroud)

但这似乎是错误的,因为参数并不都是同一类型。...args相反,无论签名中的类型是什么,也将是函数fn第二个参数的类型。...argstime

ghy*_*ybs 8

我们可以做这样的事情:

const time = <T, U extends unknown[]>(fn: (...args: U) => Promise<T>, ...args: U): Promise<T>
Run Code Online (Sandbox Code Playgroud)

游乐场链接

参数不会全部属于同一类型

的类型...args确实必须是数组/元组,因为它使用剩余运算符。

但是,我们不必键入 as U[],这确实会强制每个单独的参数为类型U,我们可以简单地使用泛型键入整个数组,前提是它被限制为一个数组:U extends unknown[]现在我们可以这样做...args: U