Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用decorator强制类的所有方法具有特定签名_Typescript_Types - Fatal编程技术网

Typescript 使用decorator强制类的所有方法具有特定签名

Typescript 使用decorator强制类的所有方法具有特定签名,typescript,types,Typescript,Types,我正在编写一个decorator,它接收一个类实例作为参数,并要求该类的所有方法都返回该参数。我遇到的问题是,在类实例中还有其他字段不符合此签名(即new,或prototype) 我怎样才能解决这个问题?这就是我所拥有的: 我的目标是使用装饰师: @迁移(ProductCreated) 类事件迁移{ 公共酒吧(a:记录):ProductCreated{ // ... } 公共foo(a:记录):ProductCreated{ // ... } } 装饰器定义: 接口类{ 新(…args:any

我正在编写一个decorator,它接收一个类实例作为参数,并要求该类的所有方法都返回该参数。我遇到的问题是,在类实例中还有其他字段不符合此签名(即
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方法。为什么要在这里反复检查?也许我误解了,但是通过使用索引访问类型声明强制执行类型的接口,这不是更容易实现吗?是的,但除此之外,
迁移
还做了其他一些事情。