索引签名

索引签名

在js中ES6允许用表达式作为对象的属性名,但是一定要将表达式放在方括号内。会把表达式使用toString()方法,这样js中对象和函数等也可以作为索引。而ts 做了进一步的约束,索引类型只能是:string | number | symbol,而value 可以是任意类型

索引签名的名称如[index:number]:string里的index只是占位符并无任何意义,可以是任意单词。

索引签名就是在约束了索引(key)类型的基础上,统一定义了对象的 keyvalue 的类型 。换句话说,索引签名可以在只知道keyvalue 的类型下,来统一定义对象的类型

当声明一个索引签名后,所有成员的key和value都必须符合索引签名

js 复制代码
interface Sign1 {
  // key 只是占位符
  [key: string]: string;
}

type Sign2 = {
  [index: number]: string | number;
};

const foo: {
  [aaa: string]: { message: string }; // value 只能是1个对象,并且只有1个属性 message
} = {};

定义了索引签名,那么确定属性和可选属性的类型都必须是它的类型的子集

js 复制代码
type attentionType{
    name: string; // 编译通过
    age?: number; // 编译报错:类型"number | undefined"的属性"age"不能赋给"string"索引类型"string"。ts(2411)
    sex?: undefined; // 编译通过
    [propName: string]: string | undefined;
}

在多个索引签名存在时,string 类型的索引最严格,书写时应该包含所有的 value 类型。其他类型的索引,对应的 value 类型只能是string 类型的value类型的子级

js 复制代码
interface Sign3 { 
    [key: string]: string | number | boolean;// 必须包括所用成员类型
    [index: symbol]: string; 
    [index2: number]: number; 
}
js 复制代码
interface Animal {
  name: string;
}
interface Dog extends Animal {
  breed: string;
}

interface NotOkay {
  [x: string]: Dog;
  [x: number]: Animal; // Error
}

interface Okay {
  [x: string]: Animal;
  [x: number]: Dog; // OK
}
相关推荐
jay神3 小时前
【计算机毕业设计】基于Flask+Vue的电影数据可视化与智能推荐系统
前端·vue.js·python·信息可视化·flask·毕业设计·课程设计
FreeTinker9 小时前
HTML本地存储技术解析:localStorage与sessionStorage的原理、差异与应用场景
前端·html
qq_452396239 小时前
第十二篇:《全链路监控与可观测性:前端错误追踪与性能分析》
前端
wangruofeng10 小时前
Phosphor Icons 官网源码拆解:URL 即存储、水波动画与 7362 Star 图标库的架构实践
前端·架构·github
BigTopOne10 小时前
WebRTC Native / Android 开发学习资源整理
前端
excel11 小时前
nuxt 3 升级 nuxt 4 报错之 hasInjectionContext
前端
何以解忧,唯有..12 小时前
LangChain 工具调用(Tool Calling)实战指南
java·前端·langchain
软件聚导航12 小时前
「聚小软 AI 助手」技术升级:从数据库检索到 RAG 知识库问答
前端·数据库·mysql·微信小程序·小程序·ai编程·rag
恋猫de小郭13 小时前
看懂大模型架构术语,帮助你理解目前常见的大模型开源架构
前端·人工智能·ai编程
yma1613 小时前
通过提示词实现GitHub Pages 和 Nginx 双部署竟然这么简单?
前端