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

TypeScript类型体操:获取数组中元素对象属性的值作为新类型


title: TypeScript类型体操:获取数组中元素对象属性的值作为新类型
date: 2023-03-03 20:58:24
categories: TypeScript类型体操
tags:

  • TypeScript类型体操
  • TypeScript

首先先说获取数组中元素对象属性的值作为新类型的解决方案

  • 使用 as const 强调不可变数组
  • 使用 typeof arr 获取数组类型
  • 使用 [number] 获取数组元素对象类型,这是关键![number]表示获取数组对象元素类型,数组对象的 keynumber 类型
  • 最后指定元素属性 key 即可
const arr = [{key: 'update',},{key: 'delete'}
]

特别的需要指定 update, delete 作为某一个类型提示

// 'delete' | 'update'
type OperationalKey = (typeof arr)[number]['key']

tips: 如果遇到不可变数组与可变数组的冲突,你可以选择保留可变数组,并使用解构获得新变量作为 as const

const iArr = [...arr] as const;
type OperationalKey = (typeof iArr)[number]['key']

详细介绍

遇到一个比较麻烦的问题,个人在项目中使用 TypeScript + Vue 的技术栈,当前的需求是给一个 Action 定义类型以获得类型提示,而这个 Action 内部有一个 key 属性,key 是一个字符串但是我希望仅限于某几个字符串。

const actions = [{key: 'add',...},{key: 'delete',},{key: 'update'}
]const onAction = (action: {key: string}) => {}

很明显,当我们直接使用 string 作为 key 的类型,我们只能具体看代码有哪些操作符,如果直接在 action: {key: type} 中重新写一遍字符串类型势必麻烦且不好维护,所以如何获取 actions 数组中元素对象的属性的值作为新类型就是我们要解决的问题。

对于一个对象,我们可以使用 keyof 来取出所有的属性并作为新类型返回,但是我们需要的是属性的值作为新类型,所以某一步操作必然是 ['key']

反过来看数组,如何获取数组元素类型?在经过一番查找后,发现使用 [number] 是符合要求的,JavaScriptnumber 类型索引一般是用户通过 push, unshift 等其他操作加入的数组,这么解释也许不正确,因为JavaScript数组是一个对象,而 JavaScript 的对象的 key 是字符串,详细可以看看 Array - JavaScript | MDN (mozilla.org),总的来说,通过非负数字访问数组是我们需要的结果,所以[number] 没有任何问题。

可以获取数组元素对象类型后,还必须要注意一点,数组必须是不可变的,通常用 as const 来修饰,如果数组可变,那么相关元素属性就可变便无法正确获取。

更好的解决方案

通常为了避免魔法数字,魔法字符串,也就是很难理解含义的一系列定义,我们会定义一些常量集合来确定,但有些时候觉得麻烦便可使用上述方法来确定类型。

其他

  • typescript 如何从数组的项中获取某个值作为类型? - SegmentFault 思否
  • TypeScript 类型体操:获取数组中元素对象属性的值作为新类型 | Az’s Blog (azin-cn.github.io)
  • TypeScript 类型体操:获取数组中元素对象属性的值作为新类型 | 一抹阳光& - CSDN
http://www.lryc.cn/news/27744.html

相关文章:

  • npm,yarn和pnpm
  • 【算法】【数组与矩阵模块】在排好序的矩阵中找数,时间复杂度O(M+N)
  • 【Java|基础篇】计算机中数据的存储规则
  • RestTemplate使用HttpClient连接池
  • Python 操作Redis
  • CEC2020:鱼鹰优化算法(Osprey optimization algorithm,OOA)求解CEC2020(提供MATLAB代码
  • 词对齐 - MGIZA++
  • GUI 之 Tkinter编程
  • 【软件测试】性能测试面试题都问什么?面试官想要什么?回答惊险避坑......
  • 后端开发基础能力以及就Java的主流开发框架介绍
  • H2数据库连接时用户密码错误:Wrong user name or password [28000-214] 28000/28000 (Help)
  • 青岛诺凯达机械盛装亮相2023济南生物发酵展,3月与您相约
  • 【JAVA程序设计】【C00111】基于SSM的网上图书商城管理系统——有文档
  • 基于卷积神经网络CNN的三相故障识别
  • Java工厂设计模式详解,大厂的Java抽象工厂模式分享!
  • Git 企业级分支提交流程
  • C/C++每日一练(20230303)
  • Python3-条件控制
  • KDZD地埋电缆故障测试仪
  • 爆款升级!新系列南卡Neo最强旗舰杀到,业内首款无线充骨传导耳机!
  • 基于Spring Boot+Thymeleaf的在线投票系统
  • 【每日一题Day135】LC1487保证文件名唯一 | 哈希表
  • 计算机系统的基本组成 第一节
  • Scrapy爬虫框架入门
  • 最新使用nvm控制node版本步骤
  • Linux内核4.14版本——drm框架分析(1)——drm简介
  • Google的一道经典面试题 - 767. 重构字符串
  • E8-公共选择框相关的表
  • 再学C语言41:变长数组(VLA)
  • 物联网WEB大屏数据可视化