使用泛型类型重载TypeScript函数

使用泛型类型重载TypeScript函数,typescript,typescript-typings,typescript-generics,Typescript,Typescript Typings,Typescript Generics,我试图创建一个高阶函数,它接受回调函数并返回一个匿名函数,而匿名函数又返回回调函数的结果。返回的匿名函数接受一个名为number(n)的参数。我使用此参数作为匿名函数返回的结果类型的条件。基本上,如果数字大于1,则返回回调函数的结果数组,否则返回回调函数的结果。但我似乎无法让这个函数重载定义与泛型类型一起工作 export type ReturnedFunctionType<T> = { (): T (n: number): T[] (n?: number): T | T

我试图创建一个高阶函数,它接受回调函数并返回一个匿名函数,而匿名函数又返回回调函数的结果。返回的匿名函数接受一个名为number(n)的参数。我使用此参数作为匿名函数返回的结果类型的条件。基本上,如果数字大于1,则返回回调函数的结果数组,否则返回回调函数的结果。但我似乎无法让这个函数重载定义与泛型类型一起工作

export type ReturnedFunctionType<T> = {
  (): T
  (n: number): T[]
  (n?: number): T | T[]
}

export function higherOrderFn<T> (cb: () => T): ReturnedFunctionType<T> {
  return function (n = 1) {
    if (n === 1) {
      return cb()
    } else {
      return Array(n).fill(null).map(_ => cb())
    }
  }
}
导出类型ReturnedFunctionType={
():T
(n:数字):T[]
(n?:数字):T | T[]
}
导出函数higherOrderFn(cb:()=>T):返回的函数类型{
返回函数(n=1){
如果(n==1){
返回cb()
}否则{
返回数组(n).fill(null).map(=>cb())
}
}
}
错误显示:

Type '(n?: number) => T | T[]' is not assignable to type 'ReturnedFunctionType<T>'.
  Type 'T | T[]' is not assignable to type 'T[]'.
    Type 'T' is not assignable to type 'T[]'.
Type'(n?:number)=>T | T[]”不可分配给类型“ReturnedFunctionType”。
类型“T | T[]”不可分配给类型“T[]”。
类型“T”不可分配给类型“T[]”。

谁能解释一下为什么我不能这么做?或者我如何才能正确地键入这样的函数?

我认为您需要命名重载函数。像这样的东西应该有用

导出函数higherOrderFn(cb:()=>T){
函数foo(n?:1):T
函数foo(n:number):T[]
函数foo(n?:编号):T | T[]
函数foo(n=1){
如果(n==1){
返回cb()
}否则{
返回数组(n).fill(null).map(=>cb())
}
}
返回foo;
}
常量foobar=higherOrderFn(()=>{})
const foo1=foobar()//返回类型void
const foo2=foobar(1)//返回类型void
const foo3=foobar(2)//返回类型void[]

它认为最好的选择是“导出类型ReturnedFunctionType=(n?:number)=>T | T[];”。是的,它会消除错误。但是,应该有一种方法可以知道返回值的确切类型,这取决于我调用函数的方式,对吗?嘿,谢谢,它完成了任务。@SagarAcharya如果这解决了您的问题,您能接受答案吗