当前位置: 首页 > news >正文

对应类型和索引签名

对象类型

对象类型用于描述对象的结构——对象有哪些属性、每个属性的类型、是否可选、是否只读等。它是 TypeScript 中最核心、最常用的类型之一。

对象类型的定义方式

方式1:匿名对象类型
// 直接在变量声明中定义 let user: { id: number; username: string } = { id: 1, username: "alice" }; // 函数参数 function printUser(user: { name: string; age: number }) { console.log(`${user.name} is ${user.age} years old`); }
方式2:接口(Interface)
interface User { id: number; name: string; email: string; } const user: User = { id: 1, name: "Alice", email: "alice@example.com" };
方式3:类型别名(Type Alias)
type User = { id: number; name: string; email: string; }; const user: User = { id: 1, name: "Alice", email: "alice@example.com" };
方式4:类(Class)
class User { id: number; name: string; constructor(id: number, name: string) { this.id = id; this.name = name; } } const user: User = new User(1, "Alice");

索引签名

索引签名用于定义对象可以拥有的任意数量的属性,并约束这些属性的键和值的类型。它解决了"我不知道对象会有哪些具体属性"的问题。

type Obj = { name: string; age: number; } // 这个类型非常精确: const alice: Obj = { name: "Alice", age: 25 }; // ✅ 完美匹配 // const bob: Obj = { // name: "Bob", // age: 30, // email: "bob@test.com" // ❌ 错误!Obj 类型中没有定义 `email` // };

Obj加上一个索引签名,它就从“固定形状”变成了“灵活字典”:

type FlexibleObj = { name: string; age: number; // 索引签名:允许添加任意字符串属性,且值必须是 string 类型 [key: string]: string; }
const alice: FlexibleObj = { name: "Alice", age: 25, // ❌ 报错!注意这里 email: "alice@test.com", // ✅ 现在可以添加额外属性了 city: "Beijing", // ✅ 也可以添加其他属性 };

当你写上[key: string]: string后,就等于告诉 TypeScript:“这个对象里的所有属性值,都必须是string类型。”

  • name: string符合要求。

  • age: number是数字,不符合,所以报错。

如何修复?

1使用联合类型,让索引签名的类型包含age的类型。[key: string]: string | number;

2 [key: string]: any;

http://www.cnnetsun.cn/news/3178924.html

相关文章:

  • STM32与PCF8591的ADC/DAC信号处理方案详解
  • 嵌入式条码识别系统开发:LV30与TM4C1294方案详解
  • PIC18F45K50与DC-DC降压转换器的I2C控制设计
  • MC6470与PIC32MX470F512L在运动控制中的高效协同方案
  • 第【55期】-- 通信问题的cvx教程之基础篇【二】-- MU-MIMO下行功率分配问题SDR求解
  • EM3080-W条码解码芯片与PIC18LF45K22微控制器集成方案
  • 【JAVA毕设源码分享】基于Web的学生宿舍管理系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • 基于DRV8213和PIC18的智能散热系统设计与实现
  • EM3080-W与PIC18LF45K50构建高性价比条码识别系统
  • STM32实现BLDC电机FOC控制的关键技术与优化
  • 【Springboot毕设全套源码+文档】springboot基于个性化智能提醒的社区老年康养管理系统(丰富项目+远程调试+讲解+定制)
  • DS28EC20 EEPROM与dsPIC33FJ256GP710A的嵌入式存储方案
  • 番茄小说下载器完整指南:三步获取全网小说资源
  • AD5593R与STM32F415RG硬件协同设计与信号处理实战
  • Service Workers缓存策略错,更新不及时!
  • 基于A89307和PIC18F57K42的BLDC电机FOC控制方案
  • 2×2键盘矩阵与74HC32在PIC微控制器的应用
  • IMU与MCU协同实现6DoF运动追踪技术解析
  • c语言预备知识
  • STC3115芯片与PIC32MX675F512L在电池管理系统中的实战应用
  • Wand-Enhancer:免费解锁Wand游戏修改器专业版的终极指南
  • 5分钟实现Wand游戏修改器高级功能:开源增强工具全攻略
  • STM32F746ZG与MC6470 IMU的硬件协同与姿态解算优化
  • Chaterm — 开源SRE副驾驶,让你与服务器直接对话!
  • 6DoF运动追踪:IMU与MCU的硬件实现与算法解析
  • ICM-42688-P与STM32F745VG在运动控制中的高效集成方案
  • ICM-42605与PIC18F86J55的6DOF运动追踪系统设计
  • 盒须图实战指南:用五数概括揭示数据分布真相
  • 调查研究-215 Anthropic 双线扩张:从 Claude 模型公司到 AI 工业栈
  • 基于multisim的交通信号灯25-25-5控制器设计