- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
如何编写一个类型安全的类装饰器来正确处理静态方法?
具体来说,这个装饰器将适用于没有静态方法的类:
interface ITypeOf<T> {
new(...args: any[]): T
}
function decorate<T>(cls: ITypeOf<T>): ITypeOf<T> {
return cls
}
但 ITypeOf
不考虑静态属性,因此当它应用于具有静态属性的类时编译失败并出现此错误:
@decorate
class Foo {
static bar() {
return 42
}
}
产生错误:
Unable to resolve signature of class decorator when called as an expression.
Type 'ITypeOf<Foo>' is not assignable to type 'typeof Foo'.
Property 'bar' is missing in type 'ITypeOf<Foo>'.
function decorate<T>(cls: ITypeOf<T>): ITypeOf<T>
这是一个工作示例:http://www.typescriptlang.org/play/#src=interface…
如何编写适用于具有静态成员的类的类型安全类装饰器?
最佳答案
装饰器的返回类型必须与其正在装饰的类类型兼容,因为装饰器的返回值将在运行时替换类。为此,我们必须使用代表类本身的通用参数,它既是参数的类型又是返回类型。因此,我们将返回一个与输入类(包括静态)具有相同结构的类,编译器将满意:
function decorate<TCtor extends ITypeOf<any>>(cls: TCtor): TCtor {
return cls
}
@decorate
class Foo {
static bar() {
return 42
}
}
要对要装饰的类添加限制,我们可以对 ITypeOf
的类型参数进行更多限制:
// decorated class must have a field x: numeber
function decorate<TCtor extends ITypeOf<{ x: number }>>(cls: TCtor): TCtor {
return cls
}
@decorate // error no instance x
class Foo { }
@decorate // ok
class Boo { x!: number }
我们还可以对静态成员添加限制
// decorated class must have a static field x: numeber
function decorate<TCtor extends ITypeOf<any> & { x: number }>(cls: TCtor): TCtor {
return cls
}
@decorate // error no static x
class Foo { }
@decorate // ok
class Boo { static x: number }
关于TypeScript:处理静态方法的类型安全类装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49764953/
启动我的程序时,会弹出下一个错误 java.lang.NoClassDefFoundError: Could not initialize class javax.crypto.SunJCE_b 这意
我对 Android 应用程序开发有点陌生。在此代码中,我试图查看用户登录手机时是否启用了锁定模式。我在这里收到错误“int lockPatternEnable = Settings.Secure.g
我尝试在 UserServiceImpl 类中为我的方法创建测试: @Override public User getActualUser() throws WebSecurityExcept
以这种方式在登录或注册类中调用 __construct() 是否安全: function __construct(PDO $DBH, $_POST['1'], $_POST['2']) { $
我是一名优秀的程序员,十分优秀!