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

TypeScript 类型体操:合并映射类型的处理结果为联合类型

索引类型是 TypeScript 中的常见类型,它是聚合多个元素的类型,对象、类、元组等都是索引类型。...: TypeScript 也内置了很多基于映射类型实现的工具类型,比如 Partial、Required 等。...这样的结果就是对每个索引做了递归的处理,并且把所有索引的处理结果合并到了一起: 回顾下这个案例,它也是要把每个索引的处理结果分开,通过联合类型合并在一起。具体每个索引是做递归的处理,记录路径。...总结 索引类型是 TypeScript 中的常见类型,可以通过映射类型的语法来对它做一些修改,生成新的索引类型。...但如果你想对每个索引分别做处理,并且把结果合并为一个联合类型的时候,可以加一层映射类型来分别处理每个索引,再取 keyof Xxx,也就是每个索引类型的处理结果构成的联合类型。

1.8K40

TypeScript 对象的类型-接口

一、什么是接口 在 TypeScript 中,我们使用接口(Interfaces)来定义对象的类型 接口是一系列抽象方法的声明,是一些方法特征的集合,第三方可以通过这组抽象方法调用,让具体的类执行具体的方法...TypeScript 中接口除了可用于对类的一部分行为进行抽象以外,还可用于对「对象的形状(Shape)」进行描述 举个例子: interface Person { name: string;...上例中,任意属性的值允许是 string,但可选属性 age 的值却是 number,number 不是 string 的子属性,所以报错了 注意:一个接口中只能定义一个任意属性 如果接口中有多个类型的属性...上例中,报错信息有两处: 1、在对 faker 进行赋值的时候,没有给 id 赋值 2、在给 faker.id 赋值的时候,由于它是只读属性,所以报错了 五、联合类型和接口 以下实例演示了如何在接口中使用联合类型...Hello Hello World **Hello World** 六、接口和数组 接口中我们可以将数组的索引值和元素设置为不同类型,索引值可以是数字或字符串 interface Names {

3.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    【TypeScript】never 和 unknown 的优雅之道

    1、前言  TypeScript 在版本 2.0 和 3.0 分别引入了 “never” 和 “unknown” 两个基本类型,在引入这两个类型之后,TypeScript 的类型系统得到了极大的完善。...返回类型为底部类型的函数不能返回任何值,甚至不能返回零大小的单元类型。因此返回类型为底部类型的函数不能返回。...Exhaustive Check:为复合类型创造编译提示。 ...... 关于 never 的用途,知乎上有个很好的讨论。...不可否认的是,never 这个东西很奇妙,从集合论的角度,它是一个空集合,因此它可以通过空集合的一些特性,为我们的类型运算工作带来很大便利。...这些规则帮助我们简化了一些琐碎的类型运算,举个例子,像 Promise.race 合并的多个 Promise,有时是无法确切知道时序和返回结果的。

    1.3K20

    TypeScript 接口合并, 你不知道的妙用

    初识 声明合并(Declaration Merging) 是 Typescript 的一个高级特性,顾名思义,声明合并就是将相同名称的一个或多个声明合并为单个定义。...Typescript 通过类型合并这种机制,支持将分散到不同的文件中的命名空间的类型定义合并起来,避免编译错误。 现在是 ES Module 当道, 命名空间的模式已经不再流行。...现在 Typescript 也支持 JSX 定义的局部化,配合 jsxImportSource 选项来开启, 参考 Vue 的实现 Vue 全局组件声明 和 JSX 类似, Vue 全局组件、全局属性等声明也通过接口合并来实现..._shuriken.throw(); } } 但是这种标识符没有关联任何类型信息,无法进行类型检查和推断。 于是,笔者就想到了接口合并。能不能利用它来实现标识符和类型之间的绑定?...答案是可以的: 我们可以声明一个全局的 DIMapper 接口。这个接口的 key 为依赖注入的标识符,value 为依赖注入绑定的类型信息。

    1.2K40

    TypeScript 中的 any、unknown、never 和 void

    但在引入一些没有提供类型的第三方纯 JS 库时,还是得将它们标为 any,这个确实没啥办法。...总结就是:unknown 能看不能用,想用先类型断言。 never never 表示一个 无法被观测的类型,被赋予了该类型的变量什么都不能做。 使用 never 的一些场景。...never : T type T = Exclude; // T 的类型为 "b" | "c" // 其实应该是 never | "b" | "c",但 never...; } 当然在实际 JS 运行时,还是会返回一个默认的 undefined 的。但 TS 给返回值设置为 void,语义更好些。...never 是无法观测的类型,比如不会执行完的函数的返回值,合并结果不存在的交叉类型。在类型编程中非常活跃,常用于丢弃一些子类型。 void 就比较简单,只是代表函数没有返回值,没有其他的场景了。

    1.3K20

    【Rust 基础篇】Rust Never类型:表示不会返回的类型

    宏或者触发了panic时,其返回类型会被推断为Never类型!,因为该函数永远不会正常返回。...这时,可以将函数的返回类型设置为Never类型!,以明确表示该函数不会正常返回。 // 使用Never类型表示程序不会继续执行 fn exit_program() -> !...函数内部调用了std::process::exit函数来终止程序的运行,并将返回类型设置为Never类型!,表示该函数不会正常返回。 3....{ // Function body... } 在上述例子中,我们定义了一个函数never_returns,并将其返回类型设置为Never类型!。...; } a / b } 在上述例子中,我们定义了一个函数divide,在发生panic时,其返回类型会被推断为Never类型!。 4.

    42520

    TypeScript函数的类型

    在 TypeScript 的类型定义中,=> 用来表示函数的定义,左边是输入类型,需要用括号括起来,右边是输出类型。...用接口定义函数的形状 我们也可以使用接口的方式来定义一个函数需要符合的形状: interface SearchFunc{ (source:string,subString:string):boolean...==-1; } 采用函数表达式|接口定义函数的方式时,对等号左侧进行类型限制,可以保证以后对函数名赋值时保证参数个数、参数类型、返回值类型不变。...可选参数 前面提到,输入多余的(或者少于要求的)参数,是不允许的。那么如何定义可选的参数呢?与接口中的可选属性类似,我们用 ?...,输入为数字的时候,输出也应该为数字,输入为字符串的时候,输出也应该为字符串。

    2K30

    TypeScript 的数组类型

    如果数组成员可以是任意类型,写成any[]。当然,这种写法是应该避免的。 let arr: any[]; 数组类型的第二种写法是使用 TypeScript 内置的 Array 接口。...另外,数组类型还有第三种写法,因为很少用到,本章就省略了,详见《interface 接口》一章。 数组类型声明了以后,成员数量是不限制的,任意数量的成员都可以,也可以是空数组。...// 推断为 any[] const arr = []; 后面,为这个数组赋值时,TypeScript 会自动更新类型推断。...const arr = []; arr; // 推断为 any[] arr.push(123); arr; // 推断类型为 number[] arr.push("abc"); arr; // 推断类型为...const arr = [0, 1] as const; arr[0] = [2]; // 报错 上面示例中,as const告诉 TypeScript,推断类型时要把变量arr推断为只读数组,从而使得数组成员无法改变

    22410

    TypeScript: 常用的高级类型

    可问题在于touch的事件对象与mouse的事件对象是不一样的。那么我们在兼容了这两种事件的回调中,如何去描述该回调的事件对象呢? 通常使用 & 符号来解决这样的常见,将两种类型合并为一种类型。...type TouchEvent = React.TouchEvent & React.MouseEvent; 3 | 联合类型 当我们想要设定一个变量的类型为number时, let a: number...当然,我们也可以扩展一个数据的类型。 const attr: number | string = 20; 注意体会 & 与 | 的区别 4 类型保护 一个变量,被定义为可能是字符串,也可能是数组。...per: string | string[] 我们在代码编写时,希望能够自动提示对应的api,typescript则不知道应该如何处理这种情况。...我们在实践场景中,还有更多更复杂的组合,这些经验很难通过技术文章获取到,需要在实践中慢慢体会。除此之外,typescript官方文档中,还有一些重要的东西需要去深入学习。

    1.9K10

    TypeScript 中的高级类型

    一、是什么 在 TypeScript 中,除了基本类型如 string、number、boolean 之外,还存在一系列高级类型。...这些高级类型是 TypeScript 为了增加语言灵活性和应对复杂开发场景而提供的一些语言特性。...二、有哪些 以下是一些常见的高级类型及其应用: 交叉类型 交叉类型通过 & 操作符将多个类型合并为一个类型,新类型包含了所有合并类型的特性。...never : T; 三、总结 TypeScript 的高级类型为开发者提供了强大的工具来处理复杂的类型关系和场景。掌握这些高级类型是深入理解和有效使用 TypeScript 的关键。...随着 TypeScript 版本的不断更新,新的特性也在不断加入,因此持续学习和实践是必要的。

    10710

    TypeScript类型断言-类型的声明和转换

    TS中并不能判断在使用联合类型时具体是那种类型?当我们不知道是什么类型的情况下要使用某个类型特有的属性或者方法,那么就可以用断言来实现,它实际上是对编辑器做了提前告知的行为,但是并不能保证运行中报错。...//anyValue是any类型,在使用时候将其断言为string类型let anyValue:any = 'zhangsan';let length:number = (anyValue...).length;//0//anyValue是string或者number联合类型,在使用时候将其断言为string类型let anyValue:string | number = 'zhangsan'...,否则不要使用类型断言,这是因为类型断言会让 TypeScript 编译器将变量当做指定的类型,而不管它实际的类型,在程序运行时可能有类型错误,断言需要慎用。...比如以下案例:我们知道obj一定是有值的,请求接口后赋值给obj,所以一定是有值的,但是我们直接赋值,就会报错const obj = {};obj.name = 'zhangsan';obj.age =

    37910

    TypeScript 中的数组类型定义

    在 TypeScript 中声明和初始化数组也很简单,和声明数字类型和字符串类型的变量也差不多,只不过在指定数组类型时要在类型后面加上一个中括号 [] 语法格式 const array_name: dataype...[] = [val, val2]; 示例 声明一个 string 类型的数组 const character: string[] = ["杨过", "小龙女"]; 一维数组类型 声明一个 number..., val2, val3],[v1, v2, v3]]; // 等同于 const array_name: datatype[][] = [[val1, val2, val3]]; 多维数组类型 TypeScript...,则会限制内层数组的元素数量 Array : 表示内层数组的元素是 string 类型,限制元素数量是 1 个,输入多个会报错 const test3: Array<[string]...个 建议: 在定义数组类型的时候使用数组泛型定义,这样显得更直观一点 Tuple 元组类型(元组类型允许表示一个已知元素数量和类型的数组)

    5.4K40

    Typescript 的数据类型总结

    一、是什么 typescript 和 javascript几乎一样,拥有相同的数据类型,另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段,可以为明确的变量定义为某种类型,这样...typescript就能在编译阶段进行类型检查,当类型不合符预期结果的时候则会出现错误提示 二、有哪些 typescript 的数据类型主要有如下: boolean(布尔类型) number(数字类型)...,这时候可以使用any类型 使用any类型允许被赋值为任意类型,甚至可以调用其属性、方法 let num:any = 123; num = 'str'; num = true; 定义存储各种类型数据的数组时...,代表从不会出现的值 但是没有类型是 never 的子类型,这意味着声明 never 的变量只能被 never 类型所赋值。...never 类型一般用来指定那些总是会抛出异常、无限循环 let a:never; a = 123; // 错误的写法 a = (() => { // 正确的写法 throw new Error(

    1.2K10
    领券