我有一个函数,其中有两个函数作为参数(fn1
和fn2
)。这些函数应采用任意数量的,类型相同但返回类型不同的参数。
有没有办法确保函数的参数类型相同?
function myFunction(fn1: Function, fn2: (...args: any[]) => string): number {
return 0;
}
答案 0 :(得分:4)
您可以使用conditional types和tuples in rest parameters从第一个函数中提取参数类型,并根据提取的参数指定第二个函数
type ArgTypes<T> = T extends (...a:infer A) => unknown?A:[]
function myFunction<T extends (...a: unknown[]) => unknown>(fn1: T, fn2: (...a: ArgTypes<T>) => string) :number {
return 0;
}
myFunction((s: string) => s, (s:string) => s) //ok
myFunction((s: string) => s, (s:number) => s.toString()) //err