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
我们可以做这样的事情:
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