TypeScript:如何从带泛型的类数组推断元组类型?
修改方案
要实现dependencyValues的类型自动对应dependencies数组元素的泛型参数元组,需要调整函数的泛型定义和回调参数类型,具体修改如下:
- 保留泛型约束并利用元组推断:维持
T extends SomeClass<any>[]的约束,让TypeScript能将传入的依赖数组自动推断为元组类型(而非松散的普通数组)。 - 替换回调参数的
any[]为映射提取类型:用TypeScript的条件类型+映射类型,从T中提取每个SomeClass实例的泛型参数,组成对应元组作为dependencyValues的类型。
修改后的完整函数定义:
function someFunction<T extends SomeClass<any>[]>( name: string, callback: (dependencyValues: { [K in keyof T]: T[K] extends SomeClass<infer U> ? U : never }) => void, dependencies: T, ) { // 函数内部实现逻辑 }
验证示例
当传入包含不同泛型参数的SomeClass实例数组时,TypeScript会自动推断dependencyValues的类型为匹配的元组:
someFunction( 'someName', (dependencyValues) => { // 此处dependencyValues自动推断为[number, boolean, string] const num = dependencyValues[0]; // 类型为number const bool = dependencyValues[1]; // 类型为boolean const str = dependencyValues[2]; // 类型为string }, [new SomeClass<number>(), new SomeClass<boolean>(), new SomeClass<string>()], );
关键逻辑说明
{ [K in keyof T]: T[K] extends SomeClass<infer U> ? U : never }:遍历元组T的每个索引K,对每个元素T[K],用infer U提取SomeClass<U>中的泛型参数U,最终生成与T长度完全一致的元组类型。- 若遇到同类型元素需要强制元组推断(而非数组),可将泛型约束改为
T extends [...SomeClass<any>[]],确保TypeScript不会把元组收缩为普通数组类型。
内容的提问来源于stack exchange,提问作者nllahat
相关产品推荐
相关产品推荐

