gpt4 book ai didi

javascript - TypeScript 中的可变泛型类型?

转载 作者:行者123 更新时间:2023-11-30 07:19:48 24 4
gpt4 key购买 nike

我想在 TypeScript 中创建一个函数,它接受构造函数数组并返回相应的实例数组。请参阅下面的代码。

请注意,getArray 方法非常不正确,它只是试图传达我的意图。

这是否可能以任何形式存在,或者是否超出了 TypeScript 类型引擎的能力范围?

class T1 {}
class T2 {}
class T3 {}
type AnyCon = new() => any;

function getOne<T_Con extends AnyCon>(con: T_Con): InstanceType<T_Con> {
return new con();
}

function getArray<T_Cons>(cons: T_Cons): InstanceType<T_Cons>[] {
return cons.map( (c: con) => new con() );
}

let t1: T1 = getOne(T1);
let [t2, t3]: [T2, T3] = getArray( [T2, T3] );

最佳答案

您可以在 TS3.1 及更高版本中使用 mapped array/tuple types 执行此操作. tuples 更容易获得推断为 rest parameters而不是数组参数,所以我将改为显示:

function getVariadic<T extends Array<AnyCon>>(...cons: T): {
[K in keyof T]: T[K] extends AnyCon ? InstanceType<T[K]> : never
};
function getVariadic(...cons: AnyCon[]): any[] {
return cons.map((c: AnyCon) => new c());
}

let [t2, t3]: [T2, T3] = getVariadic(T2, T3);

编辑:自 TypeScript 4.0 引入以来 variadic tuple types您还可以让编译器从传入的数组中推断元组类型:

function getArray<T extends Array<AnyCon>>(cons: [...T]): {
[K in keyof T]: T[K] extends AnyCon ? InstanceType<T[K]> : never
};
function getArray(cons: AnyCon[]): any[] {
return cons.map((c: AnyCon) => new c());
}

let [t2, t3]: [T2, T3] = getArray([T2, T3]);

请注意 cons 参数是可变元组类型 [...T],它提示编译器推断 [T2, T3] 是元组而不是无序数组。

Playground link to code

关于javascript - TypeScript 中的可变泛型类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54701874/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com