Typescript 键入类的动态映射

Typescript 键入类的动态映射,typescript,class,export,Typescript,Class,Export,我有一个可以动态修改给定类()的函数: 接口可构造{ 新(…args:any[]):any; } 函数扩展类(Base:T,customConfig:object):T{ 返回类扩展了基{ 构造函数(…选项:任意[]){ 超级({…选项,…自定义配置}); } }; }; 这样我就可以做到: A类{ 构造函数({x,y}:{x?:number,y?:number}){ 这个.x=x; 这个。y=y; } 递增x(){ 这是0.x+=1 } } 常量B=扩展类(A,{y:6}) 常数b=新的b(

我有一个可以动态修改给定类()的函数:

接口可构造{
新(…args:any[]):any;
}
函数扩展类(Base:T,customConfig:object):T{
返回类扩展了基{
构造函数(…选项:任意[]){
超级({…选项,…自定义配置});
}
};
};
这样我就可以做到:

A类{
构造函数({x,y}:{x?:number,y?:number}){
这个.x=x;
这个。y=y;
}
递增x(){
这是0.x+=1
}
}
常量B=扩展类(A,{y:6})
常数b=新的b({x:5})
如何创建一个函数来跨类映射执行此操作,同时保留键入信息,即:

type DictionaryOfConstructors={[K in keyof T]:T[K]};
函数extendAll(类:DictionaryOfConstructors,customConfig:object){
常数更新={}
Object.entries(services.forEach([k,s])=>{
更新的[k]=扩展类,customConfig;
});
更新的回报;
}
常量类={A};
const extended=extendAll(类,{y:6})
似乎相关,但它不是动态的


谢谢

下面是
externalFactory
的修改版本。在验证类型检查时,有注释掉的示例


对于添加的示例,以下是我最后使用的:

可构造的导出接口{
新(…args:any[]):T;
}
函数扩展类(Base:T,customConfig:object):T{
返回类扩展了基{
构造函数(…选项:任意[]){
const[config,…opts]=选项;
超级({…配置,…自定义配置},…选项);
}
};
}
导出函数扩展(
类别:T,
customConfig:object,
) {
常量更新:{[name:string]:Constructable}={};
Object.entries(class).forEach([k,s])=>{
更新的[k]=扩展类,customConfig;
});
返回更新为T;
}
//以及用例:
const modifiedclass=extendAll(类,{propA:5});

您实际上想要完成什么?看起来,您可以开发一个工厂,创建外部库类的实例并设置必要的道具。我使用一个工厂函数来修改导入的类,基本上分配它们的一个内部属性,这样用户就不必这样做了。但是当我导出这些包装时,它们丢失了所有的类型信息。所以基本上我做了你提到的,我只是不能让类型正常工作。下面是GitHub示例中的当前示例(我试图在描述中对其进行简化),您的工厂正在返回一个带有实例化对象的对象,因此上面的示例
const a:a=new a()
将永远无法工作,因为
a
已经是一个实例。您真的需要创建94个对象实例吗?相反,可以根据需要实例化中的类吗?例如:
const gitlab=myservicecfactory(gitlab)
然后
myservicecfactory
将实现与
modifyServices
中相同的逻辑。它返回一个,而不是一个实例化的类。函数。。等等,也许我可以将它从一个函数更改为一个扩展原始类的类,但在构造函数中设置一个内部属性。我试试看!本来是有一些类似于你提到的东西,但后来我被卡住了,无法做exports@Paul我更新了问题,现在应该更清楚了!如何对其进行修改,使其在保持键入的同时对该对象中的所有值运行工厂?正如我在上一个extndall?@justindallymple代码片段中提到的,我刚刚用一个新的沙盒链接更新了答案。
extendAll
factory and consumer示例位于底部。现在查看一下工作,似乎只有一个类的类型是正确的,因为在我编写本文时:const bb=factories.ExternalB([{propB:345}]);它仍然是ExternalA类型。我试图得到这样的输出:const s2:{ExternalA:typeof ExternalA;ExternalB:typeof ExternalB;}如果不显式地键入所有内容,这是可能的吗?我将在您的第一条评论中研究
ExternalA
问题。你能澄清你的
s2
评论吗?我不明白
s2
应该代表什么。