Typescript如何为可变参数combine函数定义泛型返回联合类型Parser?
不是唯一实现方式,TypeScript 3.9及以上版本可以通过泛型元组推断实现任意参数数量的自动类型推导,不需要手动写重载。
实现步骤
首先假设你的Parser类型定义如下(可替换为你实际的Parser定义):
type Parser<T> = { parse(input: string): T }
直接定义可变参数的combine函数:
function combine<T extends Parser<any>[]>(...parsers: T): Parser<T extends Array<Parser<infer U>> ? U : never> { // 你的原有实现逻辑保持不变即可 return { parse(input) { for (const parser of parsers) { try { return parser.parse(input) } catch {} } throw new Error('所有parser匹配失败') } } }
使用效果验证
传入任意数量的Parser实例,返回值的联合类型会自动推导:
const numberParser: Parser<number> = { parse: s => parseInt(s) } const stringParser: Parser<string> = { parse: s => s } const boolParser: Parser<boolean> = { parse: s => s === 'true' } // 自动推导返回值类型为 Parser<number | string | boolean> const combined = combine(numberParser, stringParser, boolParser)
这个方案的原理是利用TS对泛型元组的自动推断能力,先把所有入参的类型收敛为一个元组类型T,再通过infer提取每个Parser的泛型参数,自动合并为联合类型,不需要手动为不同参数个数写重载。如果你的Parser是函数类型或者其他泛型结构,只需要调整infer对应的结构即可,核心逻辑不变。
内容的提问来源于stack exchange,提问作者zoul
相关产品推荐
相关产品推荐

