gpt4 book ai didi

TypeScript:处理静态方法的类型安全类装饰器?

转载 作者:搜寻专家 更新时间:2023-10-30 21:05:22 48 4
gpt4 key购买 nike

如何编写一个类型安全的类装饰器来正确处理静态方法?

具体来说,这个装饰器将适用于没有静态方法的类:

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/

48 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com