typescript递归处理

news/2025/2/12 1:24:49/

typescript是一种类型强约束的语言,一般来讲定义类型时都要明确指定类型的数据结构。而如果数据结构中涉及到不知道基层嵌套的递归时,就会有一些麻烦。

https://stackoverflow.com/questions/51657815/recursive-array-type-typescript

有一个回答说明了typescript中涉及到递归时的类型定义。

要点在于:要在类型内部增加自身的类型。

// 当你需要不确定末端节点的类型时,可以先定义一个Atom类型作为联合类型
type Atom = string | boolean | number
type NestedArray = Array<NestedArray | Atom>;
interface NestedArray extends Array<NestedArray | Atom> {}
// 当你确定末端节点的类型时,无需定义Atom类型,直接使用末端的类型即可
type RecursiveVector = Array<RecursiveVector | number>;
interface RecursiveVector extends Array<RecursiveVector | number> {}

在针对递归类型编写递归代码时,需要对当前递归的类型做判断:是否末端节点。如果是末端节点,则进行直接计算;如果不是末端节点,那么进入下一层递归。

比如说下面的代码用于求某两个递归数据结构中间比例的插值数值

function ArrayLinearInterpolation(startArray: RecursiveVector, endArray: RecursiveVector, param: number) {function tmpFun(startArray: RecursiveVector, endArray: RecursiveVector): RecursiveVector {if (!isArray(startArray) || !isArray(endArray)) {throw TypeError("startArray or endArray is not Array");}if (startArray.length != endArray.length) {throw TypeError("the dimension of startArray and endArray don't match");}let res: RecursiveVector = [];for (let j = 0; j < startArray.length; j++) {if (isNumber(startArray[j]) && isNumber(endArray[j])) {res.push((startArray[j] as number) + param * ((endArray[j] as number) - (startArray[j] as number)));continue;} else {res.push(tmpFun(startArray[j] as RecursiveVector, endArray[j] as RecursiveVector));}}return res;}return tmpFun(startArray, endArray);
}

返回值res必须定义为递归数据结构。在对递归数据进行节点末端判断后,再根据“是否末端”进行分别处理。

当针对末端调用递归函数进行处理时,必须用as指定末端数据类型,否则typescript在类型识别时会判断错误。当针对非末端调用递归函数进行处理时,也必须用as指定非末端的数据类型,否则typescript在类型识别时也会判断错误。

如果末端数据类型不是语言自带的数据类型,而是用户自定义的复杂类型,可以按照下面这个帖子的说明处理。

typescript递归遍历_ts 递归-CSDN博客

本质上来讲,就是在递归数据结构定义中,把子数据的类型定义为递归数据类型自身。最简单的递归数据是只包含自身,复杂的就要包含一些其他的数据。

这个有点类似于C++的链表。在C++中,某个链表数据类型中会有一个子数据是指针,该指针指向下一个同样的数据类型,当该指针为nullprt时,该链表结束。


http://www.ppmy.cn/news/1294981.html

相关文章

Ubuntu上wps调用zotero的方法

本人电脑Ubuntu22.04 克隆这位大佬的项目&#xff0c;并转到合适的目录下https://github.com/tankwyn/WPS-Zotero 输入命令 unzip WPS-Zotero-main.zip # 解压文件 cd WPS-Zotero-main # 进入目录 ./install.py # 安装文件如果上面的流程全部正常&#xff0c;恭喜成功 如果出现…

11.20 校招 实习 内推 面经

绿*泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格&#xff0c;简历修改咨询 1、校招&#xff5c;赛力斯集团2024届校园招聘热招职位盘点 校招&#xff5c;赛力斯集团2024届校园招聘热招职位盘点 2、校招&#xff5c;天津能源投资集团有限公司…

CHS_02.1.1.2+操作系统的特征

CHS_02.1.1.2操作系统的特征 操作系统的四个特征并发这个特征为什么并发性对于操作系统来说是一个很重要的基本特性资源共享虚拟异步性 各位同学 大家好 在这个小节当中 我们会学习 操作系统的四个特征 操作系统有并发 共享 虚拟和异部这四个基本的特征 其中 并发和共享是两个…

【Flink精讲】双流Join之Regular Join(即普通Join)

Regular Join 普通Join 通过条件关联两条实时数据流&#xff1a;动态表Join动态表支持Inner Join、Left Join、Right Join、Full Join。 1. Inner Join(Join)&#xff1a;只有两边数据流都关联上才输出[L,R] 2. Left Join(Left Outer Join)&#xff1a;只要左流有数据即输出[…

SpringBoot: 通过MyBatis访问ClickHouse

一、ClickHouse中建表&#xff0c;添加数据 二、SpringBoot项目添加mybatis、clickhouse、druid相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency>…

Java项目:110SSM民宿客栈管理系统

博主主页&#xff1a;Java旅途 简介&#xff1a;分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 民宿客栈管理系统基于SpringSpringMVCMybatis开发&#xff0c;功能简单&#xff0c;可用于毕设或者课程设计。可以通过系统创建你想要的角色&#xff0c;分…

西电期末1027.判断同构数

一.题目 二.分析与思路 不用把他转成字符串再转成数字之类的&#xff0c;用数学解决就好&#xff01;找出一个数的最后位就是将其对求余啊&#xff0c;找一个数有几位以前也有过啊&#xff0c;那不就过了嘛&#xff01; 三.代码实现 #include<bits/stdc.h>//万能头 in…

K8S学习指南(66)-CRD介绍

文章目录 引言什么是自定义资源定义&#xff08;CRD&#xff09;&#xff1f;CRD 对于 Kubernetes 的意义1. 定制资源类型2. 统一管理3. 更好的扩展性4. 与生态系统集成 如何使用 CRDCRD 的规范详解1. apiVersion 和 kind2. metadata.name3. spec.group 和 spec.versions4. spe…