typescript - 使用泛型类型重载 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[]'.
有人可以解释一下为什么我不能这样做吗?或者我怎样才能正确输入这样的功能?
解决方案
我认为你需要命名你的重载函数。像这样的东西应该工作
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[]
推荐阅读
- angular - Angular - 离开浏览器时覆盖默认浏览器消息而不保存更改
- excel - 对象“_Worksheet”的方法“范围”在 VBA 中失败,但在使用“选择”时没有
- python - 使用数据库信息构建动态 DAG
- java - lightbend/config 看不到值
- c# - Quartz.NET 无法启动多个作业
- apache - 如果已经存在 http 到 https 重定向,为什么需要 HSTS 标头?
- java - 在java android中使用opencv将检测到的正方形替换为可绘制图像
- reactjs - 将 react-scripts 升级到 4.xx 会破坏我的应用
- r - 使用 XLConnect 打开的文件未关闭
- spring-security - 为什么 Springs OAuth2LoginAuthenticationProvider 调用 UserInfo Endpoint?