首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

typescript 4.1中rest参数的数组和条件递归类型

TypeScript 4.1中引入了rest参数的数组和条件递归类型。

  1. Rest参数的数组:在函数定义时,可以使用rest参数语法(...)来表示接收一个不定数量的参数,并将它们作为数组进行处理。例如:
代码语言:txt
复制
function sum(...numbers: number[]) {
  return numbers.reduce((total, num) => total + num, 0);
}

console.log(sum(1, 2, 3)); // 输出 6
console.log(sum(4, 5, 6, 7)); // 输出 22

在上面的例子中,sum函数使用rest参数语法接收任意数量的参数,并将它们存储在numbers数组中。函数内部使用数组的reduce方法对参数进行求和。

  1. 条件递归类型:TypeScript 4.1引入了新的条件类型语法来处理递归类型。条件递归类型可以根据条件的真假来决定返回的类型是什么。例如:
代码语言:txt
复制
type Flatten<T> = T extends Array<infer U> ? Flatten<U> : T;

type Numbers = [1, [2, [3, [4, 5]]]];
type Flattened = Flatten<Numbers>; // 类型为 [1, 2, 3, 4, 5]

在上面的例子中,我们定义了一个Flatten类型,它接受一个类型T作为参数。如果T是一个数组类型(使用extends Array<infer U>进行判断),则递归地调用Flatten类型,并将数组中的元素类型作为参数。如果T不是数组类型,则返回T本身。

在这个例子中,我们定义了一个Numbers类型,它是一个嵌套数组类型。使用Flatten类型将Numbers类型展开为单层的数组类型[1, 2, 3, 4, 5]

这样的条件递归类型可以在很多场景下使用,比如处理嵌套的对象结构或者数组结构。

关于 TypeScript 4.1中的rest参数的数组和条件递归类型的详细信息,可以参考腾讯云官方文档中的相关章节:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

TypeScript 中的基础类型:原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型

TypeScript 强大的类型系统使得开发者能够更轻松地编写可维护、可扩展的代码。本文将详细介绍 TypeScript 中的基础类型,包括原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型。...// 字符串数组元组类型元组类型用于表示一个固定长度和类型的数组。...可以使用 (参数类型) => 返回值类型 的语法来声明函数类型。...类型推断和类型断言TypeScript 具有强大的类型推断能力,它可以根据上下文自动推断变量的类型。例如,如果我们在定义变量时直接赋值,TypeScript 可以推断出变量的类型。...总结本文详细介绍了 TypeScript 的基础类型,包括原始类型、对象类型、数组类型、元组类型、枚举类型和联合类型等方面。

80330

深入 TypeScript 高级类型和类型体操

TypeScript 高级类型是通过 type 定义的有类型参数(也叫泛型)的类型,它会对传入的类型参数做一系列的类型计算,产生新的类型。...TypeScript 高级类型会根据类型参数求出新的类型,这个过程会涉及一系列的类型计算逻辑,这些类型计算逻辑就叫做类型体操。...既然说该有的语法都有,那我们来看下循环和判断都怎么做: ts 类型的条件判断 ts 类型的条件判断的语法是 条件 ? 分支1 : 分支2 。...我们要构造一个长度为 n 的数组,那么就要传入长度的类型参数 Len、元素的类型参数 Ele、以及构造出的数组的类型参数 Arr(用于递归)。...ResStr : RepeactStr; 我们递归的构造了数组和字符串,判断构造的数组的 length 如果到了

3.9K41
  • TypeScript 类型体操 - 基础操作

    TypeScript 的高级类型支持类型参数,可以做各种类型运算逻辑,返回新的类型,和函数调用是对应的,自然也支持递归。 TypeScript 类型系统不支持循环,但支持递归。...类型系统中的高级类型也同样支持递归,在类型体操中,遇到数量不确定的问题,要条件反射的想到递归。...# 数值计算 TypeScript 类型系统中没有加减乘除运算符,但是可以通过构造不同的数组然后取 length 的方式来完成数值计算,把数值的加减乘除转化为对数组的提取和构造。...当类型参数为联合类型,并且在条件类型左边直接引用该类型参数的时候,TypeScript 会把每一个元素单独传入来做类型运算,最后再合并成联合类型,这种语法叫做分布式条件类型。...any 作为类型参数出现在条件类型左侧时,会直接返回 trueType 和 falseType 的联合类型。

    1.9K60

    在 TypeScript 中实现自定义“包含”实用程序类型

    Includes 实用类型用于检查给定类型是否包含在元组或数组类型中。它在概念上类似于 JavaScript 的数组 .includes() 方法,但适用于类型。...TypeScript 的关键概念在开始之前,让我们讨论一些对于理解我们的实现至关重要的 TypeScript 概念:条件类型:允许定义一个类型,它可以根据某些条件具有不同的形式,类似于 if 语句,但用于类型...true : IncludesRest, U> : false;让我们看看发生了什么:条件类型:检查元组的每个元素。...如果相等,则返回 true;否则,递归调用 Includes 处理其余部分(Rest)。...它帮助您了解和利用条件类型、递归类型和严格类型比较等高级概念。这不仅增强了您的 TypeScript 技能,还会产生更健壮和可维护的代码。

    17600

    【TypeScript 演化史 -- 11】泛型参数默认类型 和 新的 --strict 编译选项

    TypeScript 2.3 增加了对声明泛型参数默认类型的支持,允许为泛型类型中的类型参数指定默认类型。...接下来看看如何通过泛型参数默认将以下React组件从 JS (和JSX)迁移到 TypeScript (和TSX): class Greeting extends React.Component {...因为咱们将 props 和 state 类型设置为 any,所以 TypeScript 编译器也帮不上什么忙。...; } } 1) GreetingProps 是类型参数Props的类型参数 2) 类似地,any是类型参数 State 的类型参数 有了这些类型,咱们的组件得到更好的类型检查和自动提示...泛型参数默认类型 从 TypeScript 2.3 开始,咱们可以为每个泛型类型参数添加一个默认类型。

    1.8K30

    TypeScript 类型体操:数组长度实现数值运算

    TypeScript 类型系统中没有加减乘除运算符,但是可以通过构造不同的数组然后取 length 的方式来完成数值计算,把数值的加减乘除转化为对数组的提取和构造。...Rest['length'] : never; 类型参数 Num1、Num2 分别是被减数和减数,通过 extends 约束为 number。...类型参数 CountArr 是做计数的数组,默认值 [] 代表从 0 开始。 每次通过模式匹配提取去掉一个字符之后的剩余字符串,并且往计数数组里多放入一个元素。递归进行取字符和计数。...可以正确的算出第 8 个数是 21: 总结 TypeScript 类型系统没有加减乘除运算符,所以我们通过数组类型的构造和提取,然后取长度的方式来实现数值运算。...我们通过构造和提取数组类型实现了加减乘除,也实现了各种计数逻辑。 用数组长度做计数这一点是 TypeScript 类型体操中最麻烦的一个点,也是最容易让新手困惑的一个点。

    1.2K30

    TS 类型体操:图解一个复杂高级类型

    之前我们零散地了解了一些 TypeScript 类型体操的套路,但是没有综合练习下,今天就来做个高难度的体操,它会综合运用模式匹配、构造、递归等套路,对提升类型编程水平很有帮助。...我们要实现的高级类型如下: 它的类型参数是参数字符串 query string,会返回解析出的参数对象,如果有同名的参数,会把值做合并。...比如提取 a=b 中的 a 和 b: 这种模式匹配的套路在数组、字符串、函数等类型中都有很多应用。...比如指定 key 和 value 来生成一个索引类型: 详细了解可以看之前的一篇文章:TS 类型体操:索引类型的映射再映射 递归 TypeScript 高级类型支持递归,可以处理数量不确定的问题。...构造:通过映射类型的语法来构造新的索引类型,构造过程中可以对索引和值做一些修改 递归:当处理数量不确定的类型时,可以每次只处理一个,剩下的递归来做 然后用这些套路来实现了一个 ParseQueryString

    51610

    【万字长文】深入理解 Typescript 高级用法

    Typescript 的类型是支持 "条件判断" 的 ❝人生总会面临很多选择,编程也是一样。...Typescript 的类型是支持 "数据结构" 的 模拟真实数组 看到这里肯定有同学就笑了,这还不简单,就举例来说,Typescript 中最常见数据类型就是 数组(Array) 或者 元组(tuple...下面就引出了本小节真正的 "数组":联合类型(Union Types) 说起 联合类型(Union Types) ,相信使用过 Typescript 同学的一定对它又爱又恨: 定义函数入参的时候,当同一个位置的参数允许传入多种参数类型..."递归" 的 Typescript 中的类型也是可以支持递归的,递归相关的问题比较抽象,这里还是举例来讲解,同时为了方便大家的理解,我也会像第一节一样,把类型递归的逻辑用 Javascript 语法描述一遍...如果触发结束条件,就直接返回,否则就一直地递归调用下去,所传递的第二个参数用来保存上一次递归的计算结果。

    3.4K20

    【TypeScript 演化史 — 第十一章】泛型参数默认类型 和 新的 –strict 编译选项

    image.png TypeScript 2.3 增加了对声明泛型参数默认类型的支持,允许为泛型类型中的类型参数指定默认类型。...接下来看看如何通过泛型参数默认将以下React组件从 JS (和JSX)迁移到 TypeScript (和TSX): class Greeting extends React.Component {...因为咱们将 props 和 state 类型设置为 any,所以 TypeScript 编译器也帮不上什么忙。...; } } GreetingProps 是类型参数Props的类型参数 类似地,any是类型参数 State 的类型参数 有了这些类型,咱们的组件得到更好的类型检查和自动提示: image.png...泛型参数默认类型 从 TypeScript 2.3 开始,咱们可以为每个泛型类型参数添加一个默认类型。

    1.7K20

    TypeScript 4.3 新功能的实践应用

    比如判断一个类型是不是数组类型,如果是,就返回数组的元素类型。 type Flatten = T extends unknown[] ?...元组 tuple 和模版字符串类型 template string type 的递归操作 这一小节之前的内容都只算热身,这一小节的递归泛型是本文核心。...这一小节将在条件泛型和 infer 的基础上引入 tuple 和 template string 的递归操作。...具体到 JoinTupleToTemplateStringType 的实现,除了条件类型和 infer 的使用,我们还使用了一个威力巨大的 TS 泛型特性:递归。...在目前主流编程语言中,绝大部分都是以循环为主,甚至很多人可能听过一些「不要写递归」之类的说法。但在 TS 泛型层面,我们只能使用递归和条件来实现一些有趣的泛型函数。

    1.1K30

    一道 3 层的 TypeScript 面试题,你能答到第几层?

    ,合并之后放到数组里,然后继续处理下一个,递归进行这个流程,直到数组为空即可。...: 直接通过 function 声明函数: function func() {} 和声明匿名函数然后赋值给变量: const func = () => {} 而参数和返回值的类型都是数组,只是具体类型不知道...也就是这样: 声明两个类型参数 Target、Source,约束为 unknown[],也就是元素类型任意的数组类型。 这俩类型参数分别是传入的两个参数的类型。 返回值通过 Zip 计算得出。...然后对剩下的数组递归进行这样的处理,直到数组为空。...第二层给函数加上类型,用 function 声明类型和 interface 声明函数类型两种方式,参数和返回值都是 unknown[]。

    79130

    TypeScript类型元编程入门指南

    众所周知,TypeScript的类型系统因其高度灵活性而常常被戏称“类型体操”。各路高人纷纷在类型系统上卷了起来,实现了各种不可思议的功能。 最近徐飞叔叔还写了个中国象棋,可以说很卷了。...zhuanlan.zhihu.com/p/426966480 其实复杂类型操作并非无迹可寻,本文就试图从元编程的角度挖掘一下类型系统的潜力,希望能够帮助你抓到一些思路和脉络。...元编程的基础是图灵完备的子系统,那么TypeScript类型系统是否是图灵完备的呢?答案当然是肯定的。 TypeScript类型系统的extends ?...构成了分支的能力,而允许递归,则形成了循环的能力,加上类型依赖本身可以形成顺序结构,满足了图灵完备的要求。...递归 递归是一切复杂类型操作的基石,在缺少减法和比较运算情况下,我们只能利用元组的长度和extends来实现比较,以下代码形成了一个定长列表: type List<Type, n extends number

    27100

    TypeScript 4.1 发布,新增模板字面量类型

    作者 | Dylan Schiemann 译者 | 王者 TypeScript 团队发布了 TypeScript 4.1,其中包括功能强大的模板字面量类型、映射类型的键重映射以及递归条件类型。...社区提供了很多有趣的模板字符串文本示例,包括 querySelector、路由器参数解析、表达式解析、JSON 解析和序列化、GraphQL 类型的 AST、SQL 查询验证、CSS 解析、游戏、拼写检查...TypeScript 4.1 的另一个重要新增功能是递归条件类型,可以更容易地支持数组或复杂 promise 树的扁平化方法。条件类型现在可以立即在分支中引用自己,从而更容易创建递归类型别名。...TypeScript 团队警告说,这个模式应该谨慎使用,避免递归类型检查的速度变慢,而且如果超出了受支持的递归深度,TypeScript 编译器将会抛出编译时错误。...resolve 的参数现在在 promise 中是必需的。TypeScript 4.1 包含了一个快速修复,以简化升级过程。 条件扩展可创建可选属性。 不匹配的参数不再相关。

    2.5K20

    Type Script 的基本概念及常用语法

    图片TypeScript 是一种由微软开发的自由和开源的编程语言,它作为 JavaScript 的一个超集,扩展了JavaScript 的语法,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程...TypeScript 中的五种类型声明,分别是字符串 String、数字 Number、布尔值 Boolean、多种类型 Any、没有类型 Void,只需在参数名称后面用冒号来指定参数的类型即可 还有一种自定义类型...,在参数的顺序中,必选参数不可以在可选参数的后面,也就是说,可选参数要么放在最后,要么后面接可选参数,或有带默认值的参数 函数新特性 Rest and Spread 操作符 ......:用来声明任意数量的方法参数 Rest and Spread 操作符还有一个反过来的用法,虽然在 Complier 中有会报错提示,但却是能够成功运行的 第一次调用,由于方法定义的 3 个参数,而 args...,而for of遍历的是数组元素值,除此之外,for of还能根据某个条件终止循环,其余两者均不能终止 此外,for of 循环还能循环字符串

    2.1K30

    真实案例说明 TypeScript 类型体操的意义

    TypeScript 类型系统支持类型编程,也就是对类型参数做一系列运算产生新的类型。比如这样: type isTwo = T extends 2 ?...MergeParams, ParseQueryStringRest>> : ParseParam; 类型参数 Str 为待处理的字符串类型...对提取出来的 Param 再做处理,也就是 ParseParam,剩下的递归处理,也就是 ParseQueryStringRest>,然后把结果合并。...[One, ...Other] : [One, Other]; 类型参数 One、Other 为待合并的两个值的类型,如果两个一样就返回其中一个,否则如果是数组就合并数组,也就是...总结 类型编程是 TypeScript 的深水区内容,它是对类型做一系列类型运算后产生新的类型,它可以实现更精准的类型提示和检查。

    1.1K31

    如何在 TypeScript 中使用函数

    注意:请记住,对 JavaScript 中的函数有效的所有内容也对 TypeScript 中的函数有效。 函数类型 在前面的内容中,我们向 TypeScript 中的函数的参数和返回值添加了类型。...foundUser) { return null; } return foundUser; } 为 Rest 参数添加类型 剩余参数是 JavaScript 中的一项功能,它允许函数以单个数组的形式接收许多参数...在本节中,我们将在 TypeScript 中使用剩余参数。 通过使用 rest 参数后跟结果数组的类型,完全可以以类型安全的方式使用 rest 参数。...这些守卫在条件代码块中强制执行某些类型,其中值的类型可能会根据情况而有所不同。这些在使用 Array.prototype.filter 函数返回过滤的数据数组时特别有用。...有条件地向数组添加值时的一项常见任务是检查某些条件,然后,仅在条件为真时才添加值。如果该值不为真,则代码向数组添加一个假布尔值。

    15K10

    新的扩展名、新语法、新的工具类型

    条件类型的尾递归省略 Tail-Recursion Elimination on Conditional Types 我们使用 TS 类型别名时,常常会遇到需要循环引用类型别名自身的情况,TS 编译器会检测到可能存在的无限嵌套情况并给出警告...,你可能遇到过这种基于 infer 和 条件类型来提取字符串的情况: type TrimLeft = T extends ` ${infer Rest}` ?...而反例则是去额外的使用了条件类型的判断结果,如 type GetChars = S extends `${infer Char}${infer Rest}` ?...递归的处理条件类型,由于是尾递归所以没问题 与循环引用自身不一样 检测到条件类型的分支仍然是条件类型时,智能组织 避免导入语句被省略 Disabling Import Elision 在 TypeScript...4.5 中,专门新增了 ImportCallOptions 来作为动态导入第二个参数的类型定义。

    1.4K30

    TypeScript 4.0正式发布!现在是开始使用它的最佳时机

    在类型系统方面,我们加入了递归类型别名引用和对断言样式函数的支持,这两者都是独特的类型系统特性。...这意味着即使我们不知道要操作的实际类型,也可以表示对元组和数组的高阶操作。在这些元组类型中实例化泛型 spread(或用真实类型替换)时,它们可以产生其他数组和元组类型集。...4.0 改进了 rest 参数和 rest 元组元素的推断过程,因此我们可以类型化它并使其“正常工作”。...对 rest 参数使用元组类型是其中的关键。...type Range = [start: number, end: number]; 为了进一步加强参数列表和元组类型之间的联系,我们让 rest 元素和可选元素的语法与参数列表的语法一致。

    2.4K10

    精读《Typescript 4.5-4.6 新特性》

    也许有时不想随着 TS 版本升级而升级连带的 dom 内置类型,所以 TS 提供了一种指定 dom lib 类型的方案,在 package.json 申明 @typescript/lib-dom 即可:...,但现在才支持按照模版字符串在分支条件时,做类型收窄。...尾递归优化 TS 类型系统支持尾递归优化了,拿下面这个例子就好理解: type TrimLeft = T extends ` ${infer Rest}` ?...值得注意的是,这种类型推导是从前到后的,因为参数是自左向右传递的,所以是前面推导出后面,而不能是后面推导出前面(比如不能理解为,第二个参数为 number 类型,那第一个参数的值就必须为 a)。...顺便说一句,用了 TS 就尽量不要用 JSDoc,毕竟代码和类型分离随时有不一致的风险产生。

    68120
    领券