文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

在Typescript中如何使用for...in详解

2024-04-02 19:55

关注

如何在Typescript中使用for...in ?本人在TS中用for...in出现了些问题,也想到了一些解决方法。那么先来看看下面报错的代码吧。

interface ABC {
    a: string
    b: string
}
const x: ABC = {
    a:'1',
    b:'2'
}
const y: ABC = {
    a:'3',
    b:'4'
}
for (const key in x) {
// 在类型 "ABC" 上找不到具有类型为 "string" 的参数的索引签名。ts(7053)
    x[key] = y[key]
}

这由于在for...in循环时,也会遍历继承的属性,所以不能判断key的类型,只能是string类型。如果用Object的hasOwnProperty方法呢,然而并没有用,TS还是认为key是string类型。这时候需要自己封装一下hasOwnProperty方法。

function hasOwnProperty<T, K extends PropertyKey>(
    obj: T,
    prop: K
): obj is T & Record<K, unknown> {
    return Object.prototype.hasOwnProperty.call(obj, prop);
}
for (const key in x) { 
    if (hasOwnProperty(y,key) && hasOwnProperty(x,key)) {
        x[key] = y[key]
        //可以看到let x: ABC & Record<string, unknown>
        //x的类型变异了
    } 
}

这样就好了,这可也实在是太麻烦了。我只是遍历一个简单对象,为何要搞得这么麻烦,当然还是有简单方法的。只要循环的时候这样写就好了。

let key:keyof ABC
for (key in x) {
    x[key] = y[key]
}

是不是很简单,然而当我把接口ABC的a类型改成number的时候,ts又报错了。

//不能将类型“string | number”分配给类型“never”。
//不能将类型“string”分配给类型“never”。ts(2322)

WTF,为啥x[key]类型变成never了?因为在赋值的时候,x[key]有两种类型的可能,永远不可能赋值它两个类型,所以是never?(个人猜想)。如果用之前那种方法也是报一样的错误。由于never是TS中最底层的类型,never 仅能被赋值给另外一个 never 类型,所以x[key]不能被赋值了。 这可怎么办呢,没办法了,只能使用最后的方法了!

let key:keyof ABC
//@ts-ignore
for (key in x) {
    x[key] = y[key]
}

补充:TypeScript中使用for...in遍历对象属性会报错的解决办法

最近有一个用ts写的react项目,在里面使用for…in遍历对象属性时报了个错,类似下面这种:
解决办法:在 tsconfig.json 文件中加入下面被注释掉的那一行代码,即把 抑制隐式索引错误 置为真

"compilerOptions": {
    "target": "esnext",
    "module": "esnext",
    "moduleResolution": "node",
    "resolveJsonModule": true,
    // "suppressImplicitAnyIndexErrors": true,
    "importHelpers": true,
    "jsx": "react-jsx",
    "esModuleInterop": true,
    "sourceMap": true,
    "baseUrl": "./",
    "strict": true,
    "paths": {
      "@/*": ["src/*"],
      "@@/*": ["src/.umi/*"]
    },
    "allowSyntheticDefaultImports": true
  },

总结

到此这篇关于在Typescript中如何使用for...in的文章就介绍到这了,更多相关Typescript中使用for...in内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯