如何在TypeScript中推断含多个泛型的可变元组类型?
如何为带双泛型参数的可变元组类型编写正确的TypeScript定义?
我不确定如何为带有两个泛型参数的可变元组类型编写正确的类型定义。TypeScript可以顺利将函数的泛型剩余参数映射为单泛型参数的目标类型,且能正确推断内部函数的参数类型,但当目标类型需要两个泛型参数时,我遇到了瓶颈。
我的实际场景是为一组API处理器设计元组,这些处理器共用一个云函数入口,所有处理器执行前都需要共享通用逻辑,并且需要根据请求体、路径参数和/或查询参数验证输入,以确定调用正确的处理器。若我的术语(如泛型参数、数组与元组等)有误,欢迎指正。
单泛型参数的可行方案
当目标类型仅需一个泛型参数时,代码可以正常工作:
/** * 设计一组API处理器元组,可根据`body`验证请求体, * 并接收强类型参数执行逻辑。这类设计可让所有API处理器复用通用鉴权逻辑, * 或实现单路由根据请求执行不同操作的需求。 */ type OneGenericInput<Body extends object> = { body: Body; handler: (body: Body) => void; }; const callableGenericInputs1 = <Inputs extends object[]>(...args: { [K in keyof Inputs]: OneGenericInput<Inputs[K]> }) => { // 此处执行匹配、验证逻辑,调用对应处理器... }; const test1 = callableGenericInputs1( { body: { test: "" }, /** 鼠标悬停时`body`类型正确推断为`{ test: string }` */ handler: (body) => { /** 字符串方法可正常调用 */ return body.test.substring(0); } } );
双泛型参数的困境
当目标类型需要两个泛型参数(比如同时验证请求体和查询参数,且不能将两者合并为一个类型)时,我无法写出正确的类型定义:
type TwoGenericInputs<Body extends object, Query extends object> = { body: Body; query: Query; handler: (body: Body, query: Query) => void; };
错误尝试1:双元组泛型参数
编译器报错,且逻辑本身不合理——函数没有多个剩余参数可推断为两个独立元组:
const callableGenericInputs2_1 = < InputsBody extends object[], InputsQuery extends object[] >(...args: { [K in keyof InputsBody]: TwoGenericInputs<InputsBody[K], InputsQuery[K]> }) => {};
错误尝试2:嵌套元组泛型
编译器无报错,但test2中body和query被推断为object,丢失了具体类型信息:
const callableGenericInputs2_2 = < Inputs extends [object, object][] >(...args: { [K in keyof Inputs]: TwoGenericInputs<Inputs[K][0], Inputs[K][1]> }) => {}; const test2 = callableGenericInputs2_2( { body: { test: "" }, query: { test: 0 }, handler: (body, query) => { body.test; // 错误:类型`object`上不存在属性`test` query.test; } } )
我查阅过相关资料,现有案例均只涉及将元组映射到单泛型类型,这让我怀疑双泛型的情况是否可实现。目前想到的替代方案包括类型断言,或通过包装函数、柯里化将类型推断提取到单个处理器中,但不确定具体如何实现。
内容的提问来源于stack exchange,提问作者Conor
相关产品推荐
相关产品推荐

