使用带有数组的映射类型的Typescript
我正在尝试将映射类型与typescript一起使用,这应该是可能的,但遇到了一些问题 假设我有3门课:使用带有数组的映射类型的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<
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]