首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类型推断在.在环

类型推断在.在环
EN

Stack Overflow用户
提问于 2021-04-29 19:25:24
回答 2查看 350关注 0票数 2

打字本的推理很好。但是,这个示例不像预期的那样工作,需要一个//@ts-ignore

代码语言:javascript
复制
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是一种

代码语言:javascript
复制
interface Obj {
    a?: string;
    o?: string;
    b?: string;
    ...
}

虽然这个想法很容易掌握,但我认为在TypeScript中实现并不容易。“可以是obj的键”类型不是类型系统支持的类型。

但我这方面还能改善吗?我不喜欢//@ts-ignore

我并不是在寻找其他方法来实现同样的目标。我选择了这种方式,因为事实证明它比创建新对象和分配两个新属性更快。

EN

回答 2

Stack Overflow用户

发布于 2021-04-29 20:37:16

您可以像这样放置一个类型注释:

代码语言:javascript
复制
let p: keyof Obj
for (p in obj) {
.
.
.
票数 1
EN

Stack Overflow用户

发布于 2021-04-29 23:54:20

这是众所周知的TypeScript限制.请求将string类型缩小到被迭代对象的keyof的大多数string当前是打开的,等待更多的反馈。如果你想看到它的实现,请去那里,在这个问题上放一个“喜欢”,或者提供一个解释你的用例的评论。

同时,在for...in循环之外声明变量的另一种方法是键入cast:

代码语言:javascript
复制
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];
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67323880

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档