ts: 索引类型

一: 索引签名

索引签名用于定义对象类型,允许对象具有任意数量的属性,但属性名的类型必须是字符串(在大多数情况下)或数字(在某些特定的上下文中,如数组或类似数组的对象)。索引签名的值类型可以是任何 TypeScript 类型。

interface StringDictionary {  [index: string]: string | undefined;  
}  let myDict: StringDictionary;  
myDict["greeting"] = "hello";  
console.log(myDict["greeting"]); // 输出 "hello"

二:类型索引访问

类型索引访问允许你在类型级别上访问一个对象的索引类型。在泛型编程中,这特别有用,因为你可以根据传入的类型来动态地获取该类型的索引签名类型。

1. T[number] 是一个索引访问类型(index access type),它用于从泛型类型 T 中提取数组或类数组(如元组)类型中元素的类型。
如果 T 是一个数组或元组类型,那么 T[number] 会返回该数组或元组中所有元素的共同类型(如果存在的话),或者是一个联合类型,包含了数组中所有可能的元素类型。

const tuple = ['tesla', 'model 3', 'model X', 'model Y'] as consttype TupleToObject<T extends readonly any[]> =  {[P in T[number]] : P
}type result = TupleToObject<typeof tuple> // expected { 'tesla': 'tesla', 'model 3': 'model 3', 'model X': 'model X', 'model Y': 'model Y'}

2. T[0] 也是一个索引访问类型,但它特指泛型类型 T 的第一个元素的类型。
如果 T 是一个数组或元组类型,并且具有至少一个元素,那么 T[0] 将返回该数组或元组第一个元素的类型。

type NumberArray = number[];  
type FirstElementTypeOfNumberArray = NumberArray[0]; // FirstElementTypeOfNumberArray 类型为 number  type Tuple = [string, number, boolean];  
type FirstElementTypeOfTuple = Tuple[0]; // FirstElementTypeOfTuple 类型为 string

索引访问操作符

索引访问操作符用于访问对象的属性或数组的元素,以及在类型级别上访问类型的索引签名。

--- 数组
let arr: number[] = [1, 2, 3];  
type ElementType = typeof arr[number]; // ElementType 是 number  let tuple: [string, number] = ['hello', 42];  
type FirstElementType = typeof tuple[0]; // FirstElementType 是 string  
type SecondElementType = typeof tuple[1]; // SecondElementType 是 number
--对象
interface Person {  name: string;  age: number;  [propName: string]: any; // 索引签名  }  type PropValueType = Person[string]; // PropValueType 是 any,因为索引签名的值类型是 any
--泛型
function getProperty<T, K extends keyof T>(obj: T, key: K): T[K] {  return obj[key]; // 这里使用了索引访问操作符来访问 obj 的属性  }  let person = { name: 'Alice', age: 30 };  let name = getProperty(person, 'name'); // name 的类型是 string,值是 'Alice'
在泛型中的应用
示例一:获取对象属性的类型const person = {  name: 'Alice',  age: 30,  isStudent: false  
};function getProperty<T, K extends keyof T>(obj: T, key: K) {return obj[key]
}const name2 = getProperty(person, 'name');示例二: 映射对象类型(每个属性的值都被转换为字符串)
type Person = {  name: string;  age: number;  isStudent: boolean;  
};  type Stringify<T> = {[P in keyof T]: string
}type PersonStringified = Stringify<Person>; // { name: string; age: string; isStudent: string; }示例三: 处理数组和元组的元素
type MapArray<T, U> = {  [P in keyof T]: U;  
} & { length: number }; // 这里我们简化了数组类型,仅用于演示  type NumberArray = number[];  
type MappedArray = MapArray<NumberArray, string>; // 假设是 string[],但这里简化为 { [index: number]: string; length: number; }  // 对于元组,我们可以更精确地处理每个元素的类型  
type TupleToUnion<T extends readonly any[]> = T[number];  type Tuple = [string, number, boolean];  
type TupleUnion = TupleToUnion<Tuple>; // string | number | boolean示例四:在条件类型中使用索引访问操作符 (比如我们可以创建一个类型,它根据对象是否具有某个属性来返回不同的类型。)type HasProperty <T, K> = K extends keyof T ? T[K] : neverinterface Person {  name: string;  age: number;
}
type NameOrNever = HasProperty<Person, 'name'>; // string  
type RandomProperty = HasProperty<Person, 'random'>; // never

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/16493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CHFS数据区县码(最全版本)

CHFS数据区县码&#xff08;最全版本&#xff09; CHFS数据区县码&#xff08;2011-2019年&#xff09;&#xff0c;数据真实可用&#xff0c;并可赠送chfs2011-2019年公开数据。

【Unity2D 2022:Cinemachine】相机跟随与地图边界

一、导入Cinemachine工具包 1. 点击Window-Package Manager&#xff0c;进入包管理界面 2. 点击All&#xff0c;找到Cinemachine工具包&#xff0c;点击Install 二、相机跟随角色 1. 选中Main Camera&#xff0c;点击Component-Cinemachine-CinemachineBrain&#xff0c;新建…

linux中sysfs创建设备节点的方法和DEVICE_ATTR

使用DEVICE_ATTR宏&#xff0c;可以定义一个struct device_attribute设备属性&#xff0c;使用函数sysfs_create_group或sysfs_create_file便可以在设备目录下创建具有show和store方法的节点。能方便的进行调试。 一、使用DEVICE_ATTR构建device attribute 下面将顺着我们直接…

Sping源码(八)—Spring事件驱动

观察者模式 在介绍Spring的事件驱动之前&#xff0c;先简单的介绍一下设计模式中的观察者模式。 在一个简单的观察者模式只需要观察者和被观察者两个元素。简单举个栗子&#xff1a; 以警察盯梢犯罪嫌疑人的栗子来说&#xff1a; 其中犯罪嫌疑人为被观察者元素而 警察和军人为…

【启程Golang之旅】基本变量与类型讲解

欢迎来到Golang的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…

Fortran:forpy 嵌入Python

Fortran嵌入Python 利用forpy库&#xff0c;可以在Fortran程序内嵌入Python. program test_forpyuse forpy_modimplicit noneinteger::ierrierrforpy_initialize()!!---------------!!list!!---------------blocktype(list)::my_listierrlist_create(my_list)ierrmy_list%app…

【JVM】内存区域划分 | 类加载的过程 | 双亲委派机制 | 垃圾回收机制

文章目录 JVM一、内存区域划分1.方法区&#xff08;1.7之前&#xff09;/ 元数据区&#xff08;1.8开始&#xff09;2.堆3.栈4.程序计数器常见面试题&#xff1a; 二、类加载的过程1.类加载的基本流程1.加载2.验证3.准备4.解析5.初始化 2.双亲委派模型类加载器找.class文件的过…

Qml:第一个qml程序

//第一个qml程序import QtQuickText {height: 300text: "Hello World"width: 500 }推荐一个零声学院项目课&#xff0c;个人觉得老师讲得不错&#xff0c;分享给大家&#xff1a; 零声白金学习卡&#xff08;含基础架构/高性能存储/golang云原生/音视频/Linux内核&am…

[JDK工具-5] jinfo jvm配置信息工具

文章目录 1. 介绍2. 打印所有的jvm标志信息 jinfo -flags pid3. 打印指定的jvm参数信息 jinfo -flag InitialHeapSize pid4. 启用或者禁用指定的jvm参数 jinfo -flags [|-]HeapDumpOnOutOfMemoryError pid5. 打印系统参数信息 jinfo -sysprops pid6. 打印以上所有配置信息 jinf…

WordPress安装memcached提升网站速度

本教程使用环境为宝塔 第一步、服务器端安装memcached扩展 在网站使用的php上安装memcached扩展 第二步&#xff1a;在 WordPress 网站后台中&#xff0c;安装插件「Memcached Is Your Friend」 安装完成后启用该插件&#xff0c;在左侧工具-中点击Memcached 查看是否提示“U…

Leetcode - 398周赛

目录 一&#xff0c;3151. 特殊数组 I 二&#xff0c;3152. 特殊数组 II 三&#xff0c;3153. 所有数对中数位不同之和 四&#xff0c;3154. 到达第 K 级台阶的方案数 一&#xff0c;3151. 特殊数组 I 本题就是判断一个数组是否是奇偶相间的&#xff0c;如果是&#xff0c;…

「贪心算法」最大数

力扣原题链接&#xff0c;点击跳转。 有一个整数数组&#xff0c;我们可以按照任意顺序把这些数拼接成一个新的整数&#xff0c;如2、3和10可以拼接为2310、3102、2103等等。能拼出来的最大整数是多少呢&#xff1f;由于这个数可能非常大&#xff0c;所以结果是一个字符串。 …

Linux下的调试器 : gdb指令详解

&#x1fa90;&#x1fa90;&#x1fa90;欢迎来到程序员餐厅&#x1f4ab;&#x1f4ab;&#x1f4ab; 主厨&#xff1a;邪王真眼 主厨的主页&#xff1a;Chef‘s blog 所属专栏&#xff1a;青果大战linux 总有光环在陨落&#xff0c;总有新星在闪烁 gdb是什么 gdn是linu…

开源大模型与闭源大模型,你更看好哪一方?

开源大模型与闭源大模型&#xff0c;你更看好哪一方&#xff1f; 简介&#xff1a;评价一个AI模型“好不好”“有没有发展”&#xff0c;首先就躲不掉“开源”和“闭源”两条发展路径。对于这两条路径&#xff0c;你更看好哪一种呢&#xff1f; 1.方向一&#xff1a;数据隐私 …

springBoot项目中的static和templates文件夹

SpringBoot里面没有我们之前常规web开发的WebContent&#xff08;WebApp&#xff09;&#xff0c;它只有src目录在src/main/resources下面有两个文件夹 static和templates springboot默认 static中放静态页面&#xff0c;而templates中放动态页面。但是webapp文件夹可以有&…

基于webpack+Vue3+JavaScript+antd+less+axios技术栈实现所有组件全局自动化注册

一、前言 最近在做一个项目&#xff0c;因为项目比较小&#xff0c;用户群体年龄跨度较大&#xff0c;同时对兼容性的要求较高&#xff0c;所以选择webpackVue3JavaScriptantdlessaxios的技术栈&#xff0c;在开发的当中发现一个问题&#xff0c;原来在vue2当中&#xff0c;可…

react native 下载功能实现

RN 下载 demo iOS 安装必要的包 react-native-fs 下载使用react-native-permissions 获取权限react-native-share 保存下载的内容到手机 修改 podfile 文件 # Resolve react_native_pods.rb with node to allow for hoisting # require Pod::Executable.execute_command(n…

英伟达的GPU(3)

上节内容&#xff1a;英伟达的GPU(2) (qq.com) 书接上文&#xff0c;上文我们讲到CUDA编程体系和硬件的关系&#xff0c;也留了一个小问题CUDA core以外的矩阵计算能力是咋提供的 本节介绍一下Tensor Core 上节我们介绍了CUDA core&#xff0c;或者一般NPU&#xff0c;CPU执行…

【大数据面试题】31 Flink 有哪些重启方法

一步一个脚印&#xff0c;一天一道面试题 Flink 提供了几种不同的重启方法&#xff1a; 异常自动从 Checkpoint 重启: Checkpoint是Flink的另一种状态快照机制&#xff0c;它比Savepoint更为频繁&#xff0c;提供了细粒度的状态恢复点。通过配置Checkpoint&#xff0c;Flink会…

pyqt QMainWindow菜单栏

pyqt QMainWindow菜单栏 pyqt QMainWindow菜单栏效果代码 pyqt QMainWindow菜单栏 QMainWindow 是 PyQt中的一个核心类&#xff0c;它提供了一个主应用程序窗口&#xff0c;通常包含菜单栏、工具栏、状态栏、中心窗口&#xff08;通常是一个 QWidget 或其子类&#xff09;等。…