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

TypeScript中如何调整mynew函数类型定义消除unknown引发的属性报错

解决方案

你可以通过TypeScript的泛型元组推导能力,精准关联入参的构造函数数组和返回的实例数组类型,彻底消除unknown类型带来的报错。

修改后完整可运行代码

export interface Type<T> extends Function {
  new (...args: any[]): T;
}

// 核心修改:添加泛型元组约束
function mynew<T extends any[]>(klass: [...{ [K in keyof T]: Type<T[K]> }]): T {
  return klass.map((e) => new e()) as T;
}

class ClassA { x = 1 }
class ClassB { y = 1 }

const [a, b] = mynew([ClassA, ClassB]);

// 不再报错,a的类型自动推导为ClassA
a.x
// 不再报错,b的类型自动推导为ClassB
b.y;

关键修改说明

  • 为mynew函数新增泛型参数T,用于描述返回的实例数组的元组类型,每个位置的类型和传入的构造函数一一对应
  • 入参类型使用映射类型{ [K in keyof T]: Type<T[K]> }做约束:要求入参数组的第K个元素,必须是可以实例化出返回数组第K位类型的构造函数
  • 入参外层包裹[... ]可变元组语法,提示TypeScript将传入的数组推导为固定长度、每个位置类型明确的元组,而非宽松的(Type<ClassA> | Type<ClassB>)[]联合类型数组
  • 末尾的as T类型断言用于兼容Array.prototype.map的默认返回类型,因为逻辑上可以保证返回结果和泛型T的类型完全匹配,断言是安全的

内容的提问来源于stack exchange,提问作者januw a

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 12:06:03