在Typescript中如何使用for...in详解
作者:最后的Hibana 时间:2023-08-18 15:39:32
如何在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
},
来源:https://juejin.cn/post/7074483753472491533
标签:typescript,for,in
0
投稿
猜你喜欢
pygame游戏之旅 如何制作游戏障碍
2021-03-05 00:16:28
用pandas按列合并两个文件的实例
2022-05-31 22:21:04
vue使用Google Recaptcha验证的实现示例
2024-05-13 09:08:25
Laravel实现登录跳转功能
2023-06-14 23:35:40
Python基于mediainfo批量重命名图片文件
2021-08-20 11:31:30
通过视图修改数据时所应掌握的基本准则
2009-01-07 14:22:00
Python实现自动登录百度空间的方法
2023-11-11 09:11:23
mysql备份脚本 mysqldump使用方法详解
2024-01-24 12:27:04
全面解析Bootstrap中tooltip、popover的使用方法
2024-05-21 10:14:19
Python系统公网私网流量监控实现流程
2022-05-16 07:55:39
JavaScript模块规范之AMD规范和CMD规范
2024-04-30 08:52:46
@ResponseBody 和 @RequestBody 注解的区别
2024-04-16 09:35:00
解决vue中less的使用问题
2024-05-03 15:11:05
精简版的MySQL制作步骤
2011-03-08 09:52:00
利用Python校准本地时间的方法教程
2021-06-24 06:51:41
Pandas进行数据编码的十种方式总结
2021-10-17 19:05:56
超简单使用Python换脸实例
2021-07-31 17:03:36
mysql installer web community 5.7.21.0.msi安装图文教程
2024-01-25 02:35:23
Python代码执行时间测量模块timeit用法解析
2023-06-13 16:14:04
python使用sorted函数对列表进行排序的方法
2022-08-19 00:36:46