首页 > 解决方案 > 使用泛型类型重载 TypeScript 函数

问题描述

我正在尝试创建一个高阶函数,它接受一个回调函数并返回一个匿名函数,该函数又返回回调函数的结果。返回的匿名函数接受一个名为 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())
    }
  }
}

错误说:

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[]'.

有人可以解释一下为什么我不能这样做吗?或者我怎样才能正确输入这样的功能?

标签: typescripttypescript-typingstypescript-generics

解决方案


我认为你需要命名你的重载函数。像这样的东西应该工作

export function higherOrderFn<T> (cb: () => T) {
  function foo(n?: 1): T
  function foo(n: number): T[]
  function foo(n?: number): T | T[]   
   function foo(n = 1) {
    if (n === 1) {
      return cb()
    } else {
      return Array(n).fill(null).map(_ => cb())
    }
  }
  return foo;
}

const foobar = higherOrderFn(() => {})
const foo1 = foobar() // return type void
const foo2 = foobar(1) // return type void
const foo3 = foobar(2) // return type void[]

操场


推荐阅读