typescript - 如何为返回新函数的函数设置正确的返回类型,最后一个参数是可选的
问题描述
我正在尝试创建一个返回一个新函数的函数,该函数将最后一个参数作为可选参数,但我不知道如何实现正确的返回类型。
类似于(我知道这不起作用,因为LastOptional
不存在):
export function convert<T extends (...args: any[]) => void>(convertFunction: T): (...args: LastOptional<Parameters<T>>) => void {
...
}
像这样使用:
function test(first: string, second: number): void {
if (first === 'hello') {
console.log('bye');
} else if (second === 4) {
console.log(5);
}
}
const converted = convert(test);
converted('hello');
在这里,converted
应该有类型签名:
const converted: (first: string, second?: number | undefined) => void
谢谢。
解决方案
我设法用以下类型完成了这项工作:
export type LastOptional<T extends any[]> =
T extends [infer T1] ? [T1?] :
T extends [infer T1, infer T2] ? [T1, T2?] :
T extends [infer T1, infer T2, infer T3] ? [T1, T2, T3?] :
T extends [infer T1, infer T2, infer T3, infer T4] ? [T1, T2, T3, T4?] :
T extends [infer T1, infer T2, infer T3, infer T4, infer T5] ? [T1, T2, T3, T4, T5?] :
T;
像这样使用:
export function convert<T extends (...args: any[]) => void>(convertFunction: T): (...args: LastOptional<Parameters<T>>) => void {
...
}
但是,这不会保留参数名称,欢迎提出有关如何保留这些名称的任何建议。
推荐阅读
- python - 在python中用for循环制作字典
- java - 依赖注入导致 main 方法被新关键字填充
- ios - 使用 Flatmap 和多个订阅者时组合多次调用的 Future 块
- python - 将 Python 脚本作为 exe 或在虚拟环境中共享
- c# - 如何在 mongo 中使用带有空字段的表达式
- python - 在 Python 2.7 中将整数提高到负整数幂
- python - 在更大的列表中添加列表
- mysql - 一个 SQL 查询,用于获取可能使用子查询上传的文件的最后状态
- html - html相当于c#的分组框
- django - 在 Django 中删除评论后如何重定向到帖子详细信息页面?