typescript中循环对象(for...in)的类型问题 keyof

2024-03-28 20:28

本文主要是介绍typescript中循环对象(for...in)的类型问题 keyof,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1)、 在js里,对象的键是变量没有问题。直接使用: 对象[键名]

2)、在ts里,就需要对键名做专门的类型定义

一、定义对象时,明确写出键和值的取值类型。

let obj: { [key: string]: any }

代码示例:

1、给对象定义类型时,明确写出对象的键的类型和可接受的值的类型。如:
let obj: { [key: string]: any }
表示obj变量是对象类型,键是字符串类型,值是any类型。obj = { name: "张三疯", age: 12 };for (const key in obj) {console.log(`${key}: ${obj[key]}`);
}再如:
let obj: { [key: string]: (number | string) }
表示obj变量是对象类型,键是字符串类型,值是number | string 类型。
obj = { name: "张三疯", age: 12 };for (const key in obj) {console.log(`${key}: ${obj[key]}`);
}

注意:key取值只能是string,number,symbol,或者 template literal type(模板文字类型)

二、如果定义对象时,对象的属性名和类型都对应的明确了

(如:用interface或者type定义了对象类型)。

就可以使用 keyof 的方式限制键的取值可能性。如下示例。要注意看注释。

interface IBanner {img: string;alt: string;link: string;
}let obj: IBanner;
obj = {"img":"hello","alt":"这是一张图片","link":"https://blog.csdn.net/jiang7701037"
};// 下面这句话限定了key的取值只能是字符串:"img","alt","link",
let key:keyof typeof obj;//或者:let key:keyof IBanner;
for(key in obj){console.log(`${key}: ${obj[key]}`);//???如果企图在这里面给 obj[key]赋值的话,是做不到的。因为,ts对obj[key]推论出的类型是never。
}// key ="img";
key ="hello";//不能这样赋值,因为 key的取值只能是字符串:"img"、"alt"、"link" 三者之一。

三、再看一个稍微复杂一点的例子。也是用了keyof

interface ITypeIndex {extralarge: "extralarge";major: "major";ordinary: "ordinary";
}// 定义对象类型
interface IState{text:string,count:number;type:keyof ITypeIndex; //此处如果写成字符串是不行的, keyof ITypeIndex就是类型的定义。
}// 定义对象数组
const states:IState[] = [{text:"特大",count:2,type:"extralarge"},{text:"重大",count:10,type:"major"},{text:"一般",count:20,type:"ordinary"}
]interface IObj {extralarge: number;major: number;ordinary: number;
}const obj:IObj = {extralarge: 1,major: 2,ordinary: 3,
}states.forEach(item=>{console.log(obj[item.type]);
})

这篇关于typescript中循环对象(for...in)的类型问题 keyof的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/856619

相关文章

Vue3绑定props默认值问题

《Vue3绑定props默认值问题》使用Vue3的defineProps配合TypeScript的interface定义props类型,并通过withDefaults设置默认值,使组件能安全访问传入的... 目录前言步骤步骤1:使用 defineProps 定义 Props步骤2:设置默认值总结前言使用T

Spring 依赖注入与循环依赖总结

《Spring依赖注入与循环依赖总结》这篇文章给大家介绍Spring依赖注入与循环依赖总结篇,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Spring 三级缓存解决循环依赖1. 创建UserService原始对象2. 将原始对象包装成工

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方

Web服务器-Nginx-高并发问题

《Web服务器-Nginx-高并发问题》Nginx通过事件驱动、I/O多路复用和异步非阻塞技术高效处理高并发,结合动静分离和限流策略,提升性能与稳定性... 目录前言一、架构1. 原生多进程架构2. 事件驱动模型3. IO多路复用4. 异步非阻塞 I/O5. Nginx高并发配置实战二、动静分离1. 职责2

解决升级JDK报错:module java.base does not“opens java.lang.reflect“to unnamed module问题

《解决升级JDK报错:modulejava.basedoesnot“opensjava.lang.reflect“tounnamedmodule问题》SpringBoot启动错误源于Jav... 目录问题描述原因分析解决方案总结问题描述启动sprintboot时报以下错误原因分析编程异js常是由Ja

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十