Typescript 使用decorator强制类的所有方法具有特定签名
我正在编写一个decorator,它接收一个类实例作为参数,并要求该类的所有方法都返回该参数。我遇到的问题是,在类实例中还有其他字段不符合此签名(即Typescript 使用decorator强制类的所有方法具有特定签名,typescript,types,Typescript,Types,我正在编写一个decorator,它接收一个类实例作为参数,并要求该类的所有方法都返回该参数。我遇到的问题是,在类实例中还有其他字段不符合此签名(即new,或prototype) 我怎样才能解决这个问题?这就是我所拥有的: 我的目标是使用装饰师: @迁移(ProductCreated) 类事件迁移{ 公共酒吧(a:记录):ProductCreated{ // ... } 公共foo(a:记录):ProductCreated{ // ... } } 装饰器定义: 接口类{ 新(…args:any
new
,或prototype
)
我怎样才能解决这个问题?这就是我所拥有的:
我的目标是使用装饰师:
@迁移(ProductCreated)
类事件迁移{
公共酒吧(a:记录):ProductCreated{
// ...
}
公共foo(a:记录):ProductCreated{
// ...
}
}
装饰器定义:
接口类{
新(…args:any[]):T
}
类型Foo={
[P in keyof T]
:T[P]扩展(旧:记录)=>V
“行得通!”
“没有!”
}
函数迁移(y:类){
return(x:Foo):void=>{}
}
理论上,如果其中一个方法的签名与
Foo
中定义的不一样,那么它应该失败,但如果我这样做,就不会出现编译错误。它最终成为TypeScript闭包的一种奇怪行为。如果我在返回类型中指定了Migrates
的类型参数,它将起作用
这样解决:
//需要告诉编译器它至少有一个构造函数
导出接口类{
//eslint禁用下一行@typescript eslint/无显式任何
新(…args:any[]):t反射
}
//将属性约束为具有相同的类型
类型同质化属性类型={
[K in keyof Type]:t属性类型
}
//我们希望用于方法的类型
类型MigrationMethod=(x:Record)=>t概念
//此类型约束要使用的第一个参数的属性
//在类型MigrationMethod中,返回类型由第二个参数指定
类型迁移=同质化属性类型
//装饰函数(corried)接受一个约束
//返回方法的类型,然后返回它将约束的类
//类型级别。在那之后,我们可以用它做任何我们想做的事情。
函数迁移(
概念:课堂
): (
k:课堂
)=>无效{
返回(klass)=>{
返回{}如任何//在这里我们将做我们想要的其他事情
}
}
这听起来像是您想检查一个类是否正确设置为返回Migrates
中给出的type-in方法。为什么要在这里反复检查?也许我误解了,但是通过使用索引访问类型声明强制执行类型的接口,这不是更容易实现吗?是的,但除此之外,迁移
还做了其他一些事情。