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
相关产品推荐
相关产品推荐

