在Typescript中如何使用for...in详解
作者:最后的Hibana 发布时间:2023-08-18 15:39:32
标签:typescript,for,in
如何在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
0
投稿
猜你喜欢
- 大家经常用的是Adodb.Stream,但这时就有个缺陷,就是不支持断点续传了。经常看到flashget中是红脸(即不支持断点续传)其实支持
- 在实际的应用中,Access做应用程序时,经常会做成"数据"和"程序"两个数据库,"数据&
- 为什么使用Python 假设我们有这么一项任务:简单测试局域网中的电脑是否连通.这些电脑的ip范围从19
- 微软在今天早上发布新的安全通告证实,一处远程执行代码漏洞影响到了整个SQL Server产品线。该漏洞的入侵代码在两周前已经被公布在互联网上
- 可能很多人都要问,网站的文字还需要设计吗?对于很多的网站来说,字在整个网站的内容中占了80%以上甚至更多,或者换个角度上说,网站可以没有颜色
- 前言最近在开发项目时遇到了发现一个问题,gorm虽然可以自动帮你维护 created_at、updated_at、deleted_at这些关
- 1.如何将Query String传送到另一个ASP文件去?Response.Redirect("second.asp? 
- 问题:MySQL 5.0不能使用自动增加字段。具体原因:引起的原因是在MySQL5.0.2版本中的The Server SQL Mode 中
- 后台数据库: [Microsoft Access] 与 [Microsoft Sql Server] 更换之后,ASP代码应注意要修改的一些
- $server->connections//server−>connections遍历所有websocket连接用户的fd,给所
- 照片尺寸 单位:cm1X1.5 (1寸) 2.6*3.9 一寸2.5*3.5 1.5X2 (2寸) 3.8*
- 一、怎么样取得最新版本的MySQL?要安装MySQL,首先要当然要取得它的最新版本,虽然大家都知道在FreeBSD的Packages中可以找
- 最近发现一个问题,是关于IDEA的一些骚操作的事儿~具体怎么回事,一起来看看。我们都知道使用git分布式版本控制工具,提、拉 代码都会有一个
- 1、su – oracle 不是必需,适合于没有DBA密码时使用,可以不用密码来进入sqlplus界面。 2、sqlplus /
- 如何制作一个从Access数据库中读取记录的下拉菜单?看看这个例子:<% SQL = "SEL
- <%dim conn ’定义一个连接变量 dim&nbs
- 今天交流会上,分享前端的开发经验,有一条虽然很快带过,但是我倒是印象蛮深刻的,就写点小结来分享一下吧。不知道是标准害了大家还是大家害了标准,
- 如何在ADO中使用SQL函数?代码见下:<%Set conn1 = Server.CreateObjec
- time模块中的三种时间表示方式:时间戳结构化时间对象格式化时间字符串1.时间戳时间戳1970.1.1到指定时间到间隔,单位是秒import
- 用VBS语言实现的一个简单网页计算器,功能:可以进行加法、减法、乘法、除法、取反、开根号、及指数运算。虽然简单但是比起windows xp自