如何更改静态属性字段';TypeScript中属性装饰器中的s值?

如何更改静态属性字段';TypeScript中属性装饰器中的s值?,typescript,Typescript,我想给静态属性一些初始值,基于某些计算,如果这些属性已经被修饰过,那么我制作了这样的代码: function deco(display?: string) { // It looks like `any` could work here instead of `T` but I don't want to use `any` return function <T> (target: T, key: string) { /* Element implicitly has

我想给静态属性一些初始值,基于某些计算,如果这些属性已经被修饰过,那么我制作了这样的代码:

function deco(display?: string) {
  // It looks like `any` could work here instead of `T` but I don't want to use `any`
  return function <T> (target: T, key: string) {
    /*
Element implicitly has an 'any' type because expression of type 'string' can't be used to index type '{}'.
  No index signature with a parameter of type 'string' was found on type '{}'.ts(7053)
    */
    if (typeof target[key] !== 'number') {
      target[key] = 0
    }
  }
}

class A {
    @deco('foo')
    static foo : number

    @deco('bar')
    static bar : number
}
功能装饰(显示?:字符串){
//看起来‘any’在这里可以代替‘T’,但我不想用‘any’`
返回函数(目标:T,键:字符串){
/*
元素隐式具有“any”类型,因为“string”类型的表达式不能用于索引类型“{}”。
在类型“{}”上找不到具有“string”类型参数的索引签名。ts(7053)
*/
如果(目标[键]的类型)!=='number'){
目标[键]=0
}
}
}
甲级{
@装饰(foo)
静态foo:number
@装饰(“酒吧”)
静态条:数字
}

如何使其工作?

由于您不想使用
任何
,您可以使用其他方法类型参数和类型为factory(内部)函数尝试类似的操作:

返回函数(目标:T,键:K){
如果(目标[键]的类型)!=='number'){
目标[键]=0,作为T[K]&编号;
}
}
此代码的问题在于,它假定
@deco
将仅用于
number
类型的属性,否则可能会有意外行为。例如,如果您对
string
类型的属性使用此装饰器,它仍会将其值设置为
0
。这是可以接受的,因为TypeScript只是JavaScript的超集,因此是完全有效的JavaScript,我们强制将
target[key]
设置为
T[K]
的交叉类型(即,TypeScript定义的
target[key]
类型;允许将
target[key]
设置为该值)和
number
(允许分配编号
0
)。它围绕类型安全


理想情况下,您可以直接在它们的声明中设置初始值,而不是依赖装饰程序来填充它们。

您的问题不会到此为止,因为
@deco('foo')
@deco('bar')
都有错误。这是因为我们不能从
{[k:string]:number}
扩展
A
。所以你应该首先解决这个问题。@MajidMohammadi我更新了代码这个表达式
T[K]&number
是什么意思?@jayatubi
T[K]&number
T[K]
number
类型的交集。太好了。
T[K]&number
解决了我的问题。我以前从未见过关于这种用法的文档。你能分享一个关于它的链接吗?@jayatubi用交叉路口的文档参考编辑了答案。