在TypeScript中动态添加函数声明

在TypeScript中动态添加函数声明,typescript,Typescript,我是TypeScript新手,尝试实现一个自动生成的构建器模式,这样我就可以按照 class-Foo{ @可构建('inBar')) 公共栏='未初始化'; 构造函数(){} } const FooBuilder=getBuilder(Foo); const foo=new FooBuilder().inBar('My Bar').build(); 考虑到我不仅是TS新手,而且已经离开JS一段时间了,写这篇文章多少有些直截了当 当然,现在传输员抱怨不知道inBar功能。我可以使用[]操作符,比

我是TypeScript新手,尝试实现一个自动生成的构建器模式,这样我就可以按照

class-Foo{
@可构建('inBar'))
公共栏='未初始化';
构造函数(){}
}
const FooBuilder=getBuilder(Foo);
const foo=new FooBuilder().inBar('My Bar').build();
考虑到我不仅是TS新手,而且已经离开JS一段时间了,写这篇文章多少有些直截了当

当然,现在传输员抱怨不知道
inBar
功能。我可以使用
[]
操作符,比如
constfoo=newfoobuilder()['inBar']('mybar').build()
是否有某种方法可以动态地向类型添加函数?可能使用
反射元数据
API?

我知道装饰器不应该向装饰类添加方法,但在本例中,我尝试动态创建一个新类,以避免编写和维护与构建器类关联的所有样板代码。能够动态添加类型声明在这里非常有用。

JS非常动态,而TS则不是。关于TS中的打字系统,它主要是功能性的,或者说是纯粹的。AFAIK唯一的副作用是ish功能。动态添加声明取决于此功能

想法很简单:当您在JS端动态创建
builders
时,为了相应地反映这些正在进行的事件,您还应该“动态”扩展TS端的注册表接口

这里是要点。检查这个完整的例子

//空接口,稍后展开
接口生成器注册表{}
常量builderRegistry:IBuilderRegistry={}如有
福班{
@可构建('inBar'))
公共栏='未初始化';
构造函数(){}
}
接口IFooBuilder扩展了构建器{
inBar(val:string):IFooBuilder
}
//展开IBuilderRegistry接口
接口IBuilderRegistry{
'Foo':{new():IFooBuilder}
}
const FooBuilder=getBuilder(Foo);
const foo=new FooBuilder().inBar('My Bar').build();//一切都好

JS是非常动态的,而TS则不是。关于TS中的打字系统,它主要是功能性的,或者说是纯粹的。AFAIK唯一的副作用是ish功能。动态添加声明取决于此功能

想法很简单:当您在JS端动态创建
builders
时,为了相应地反映这些正在进行的事件,您还应该“动态”扩展TS端的注册表接口

这里是要点。检查这个完整的例子

//空接口,稍后展开
接口生成器注册表{}
常量builderRegistry:IBuilderRegistry={}如有
福班{
@可构建('inBar'))
公共栏='未初始化';
构造函数(){}
}
接口IFooBuilder扩展了构建器{
inBar(val:string):IFooBuilder
}
//展开IBuilderRegistry接口
接口IBuilderRegistry{
'Foo':{new():IFooBuilder}
}
const FooBuilder=getBuilder(Foo);
const foo=new FooBuilder().inBar('My Bar').build();//一切都好

我想,这正是你要问的。现在,你应该直接用修饰符字段扩展你的类的类型。可能是@LevitatomBalance的重复。我看不出这个问题与你提到的问题有什么关系。你认为这也是不可能的吗?@hackape这个问题的元是相似的。Decorators(根据我提到的问题,现在还没有)exend正在使用它们的实体类型,所以,基本上,这个问题与我提到的一个类似,我想:)当然,正如我在第一篇评论中所说的,我认为只有一种方法可以实现这一点——手动扩展类型。我问了一些类似的问题,关于
数组
装饰有
@observable
,来自
mobx
。我想,这正是你要问的。现在,你应该直接用修饰符字段扩展你的类的类型。可能是@LevitatomBalance的重复。我看不出这个问题与你提到的问题有什么关系。你认为这也是不可能的吗?@hackape这个问题的元是相似的。Decorators(根据我提到的问题,现在还没有)exend正在使用它们的实体类型,所以,基本上,这个问题与我提到的一个类似,我想:)当然,正如我在第一篇评论中所说的,我认为只有一种方法可以实现这一点——手动扩展类型。我问了一些类似的问题,关于
数组
装饰有
@observable
,来自
mobx
。我有另一篇关于利用声明合并的TS技巧的帖子,其中有一个更合适的例子。如果你感兴趣,你可以。是的,这正是我的意思:我有另一篇关于利用声明合并的TS技巧的帖子,其中有一个更合适的例子。如果你感兴趣,你可以。是的,这正是我的意思:D