如何更改静态属性字段';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
是什么意思?@jayatubiT[K]&number
是T[K]
和number
类型的交集。太好了。T[K]&number
解决了我的问题。我以前从未见过关于这种用法的文档。你能分享一个关于它的链接吗?@jayatubi用交叉路口的文档参考编辑了答案。