let val = target[key]; 元素隐式具有 "any" 类型
来源:4-1 什么是注解

lovejavacoffee
2024-09-03
export function Emoji() {
return (target: object, key: string) => {
let val = target[key];
const getter = () => {
return val;
}
const setter = (value: string) => {
val = 😊 ${value} 😊
;
}
Object.defineProperty(target,key,
{
get: getter,
set: setter,
enumerable: true,
configurable: true
}
);
}
}
元素隐式具有 “any” 类型,因为类型为 “string” 的表达式不能用于索引类型 “{}”。
在类型 “{}” 上找不到具有类型为 “string” 的参数的索引签名。ts(7053)
(parameter) key: string
没有可用的快速修复
1回答
-
接灰的电子产品
2024-09-24
这个错误是因为TypeScript无法推断出target对象的类型,所以它默认为{}(空对象)。为了解决这个问题,你需要为target对象提供一个更具体的类型。你可以使用泛型来实现这一点。
这是一个修改后的示例:
type TargetType = { [key: string]: any };
export function Emoji<T extends TargetType>() {
return (target: T, key: keyof T) => {
let val = target[key];
const getter = () => {
return val;
};
const setter = (value: string) => {
val = `😊 ${value} 😊`;
};
Object.defineProperty(target, key, {
get: getter,
set: setter,
enumerable: true,
configurable: true,
});
};
}在这个示例中,我们定义了一个TargetType类型,它允许任何字符串键和任意值。然后,我们使用泛型T来表示Emoji函数的参数类型,并将其限制为TargetType的子类型。这样,TypeScript就可以推断出target对象的类型,并且不会出现类型错误。
使用这个修改后的Emoji函数,你可以像这样使用它:
class MyClass {
@Emoji()
myProperty: string;
}
const instance = new MyClass();
instance.myProperty = 'Hello';
console.log(instance.myProperty); // 输出: 😊 Hello 😊00
相似问题