使用带有数组的映射类型的Typescript

使用带有数组的映射类型的Typescript,typescript,Typescript,我正在尝试将映射类型与typescript一起使用,这应该是可能的,但遇到了一些问题 假设我有3门课: A类{ 公共食品1=1; } B类{ 公共食品2=1; } C类{ 公共食品3=1; } 常数基=[A,B,C]作为常数; 基本上,我想要的是将base传递到某个函数中,然后返回一个包含3个匹配实例的数组 type CTOR = new(...args: any[]) => any function instantiate1<T extends ReadonlyArray<

我正在尝试将映射类型与typescript一起使用,这应该是可能的,但遇到了一些问题

假设我有3门课:

A类{
公共食品1=1;
}
B类{
公共食品2=1;
}
C类{
公共食品3=1;
}
常数基=[A,B,C]作为常数;
基本上,我想要的是将
base
传递到某个函数中,然后返回一个包含3个匹配实例的数组

type CTOR = new(...args: any[]) => any

function instantiate1<T extends ReadonlyArray<CTOR>>(arr: T): {[K in keyof T]: T[K]} {
    const items = arr.map(ctor => new ctor());
    return items as any; //Don't mind about breaking type safety inside the function
}
这很有意义,因为我还没有真正“映射”类型,只是确保语法正常

但是,如果我尝试实际映射类型:

function instantiate2<T extends ReadonlyArray<CTOR>>(arr: T): {[K in keyof T]: InstanceType<T[K]>} {
    const items = arr.map(ctor => new ctor());
    return items as any; //Don't mind about breaking type safety inside the function
}
函数实例化2(arr:T):{[K in keyof T]:InstanceType}{
const items=arr.map(ctor=>new ctor());
返回任意项;//不介意破坏函数内部的类型安全性
}
我得到一个错误,
T[K]
不满足实例类型的约束

有人认为这是一个解决办法吗


这是TypeScript中的一个已知错误,根据。这是一个相当老的问题,现在是“积压”,所以我不希望它会很快得到解决


解决办法:

显式地将
T[K]
约束到所需的构造函数类型。我通常这样做:

declare function instantiate<T extends ReadonlyArray<Ctor>>(arr: T): {
    [K in keyof T]: InstanceType<Extract<T[K], Ctor>>
};

const result = instantiate(base);
// const result: readonly [A, B, C]
因此,您可以将其松开:

type MyInstanceType<T> = // no constraint on T
    T extends new (...args: any) => infer R ? R : any;
type MyInstanceType=//对T没有约束
T扩展新(…参数:any)=>推断R?R:任何;
然后,您的原始版本将按预期工作:

declare function instantiate<T extends ReadonlyArray<Ctor>>(arr: T): {
    [K in keyof T]: MyInstanceType<T[K]>
};

const result = instantiate(base);
// const result: readonly [A, B, C]
声明函数实例化(arr:T):{
[K in keyof T]:MyInstanceType
};
const result=实例化(基本);
//常量结果:只读[A、B、C]

type MyInstanceType<T> = // no constraint on T
    T extends new (...args: any) => infer R ? R : any;
declare function instantiate<T extends ReadonlyArray<Ctor>>(arr: T): {
    [K in keyof T]: MyInstanceType<T[K]>
};

const result = instantiate(base);
// const result: readonly [A, B, C]