打字本的推理很好。但是,这个示例不像预期的那样工作,需要一个//@ts-ignore。
for (const p in obj) {
if (p !== 'staticCounter' && p !== 'staticProperty') {
//@ts-ignore
delete obj[p];
}
}没有忽略,我就得到了错误
const : string元素隐式具有'any‘类型,因为类型'string’的表达式不能用于索引类型'Obj‘。在‘Obj’..ts(7053)类型上没有发现参数为“string”的索引签名。
obj是一种
interface Obj {
a?: string;
o?: string;
b?: string;
...
}虽然这个想法很容易掌握,但我认为在TypeScript中实现并不容易。“可以是obj的键”类型不是类型系统支持的类型。
但我这方面还能改善吗?我不喜欢//@ts-ignore。
我并不是在寻找其他方法来实现同样的目标。我选择了这种方式,因为事实证明它比创建新对象和分配两个新属性更快。
发布于 2021-04-29 20:37:16
您可以像这样放置一个类型注释:
let p: keyof Obj
for (p in obj) {
.
.
.发布于 2021-04-29 23:54:20
这是众所周知的TypeScript限制.请求将string类型缩小到被迭代对象的keyof的大多数string当前是打开的,等待更多的反馈。如果你想看到它的实现,请去那里,在这个问题上放一个“喜欢”,或者提供一个解释你的用例的评论。
同时,在for...in循环之外声明变量的另一种方法是键入cast:
interface Obj {
a?: string;
o?: string;
b?: string;
}
const obj : Obj = {
a: "John",
b: "Mary"
};
for(const p in obj) {
delete obj[<keyof Obj>p];
}https://stackoverflow.com/questions/67323880
复制相似问题