You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:41:33