代码先锋网 代码片段及技术文章聚合

Typescript的联合类型、Partial、Pick、Exclude、Omit介绍

技术标签: typescript  高级类型  typescript  javascript  ts

联合类型

/* 首先是联合类型的介绍 */
let a: string | number = '123' // 变量a的类型既可以是string,也可以是number
a = 123

Partial (意思是部分的; 不完全的),ts中就是让一个定义中的所有属性都变成可选参数

// 定义一个Person接口
interface Person {
  name: string
  age: number
}

// 但是我们有可能数据是请求过来的,刚开始我们需要定义一个空对象,如下。
const person1: Person = {}
/**
  但是这样就加粗样式会出现报错,类型“{}”缺少类型“Person”中的以下属性: name, age。
  可能我们可以更改定义方式如下,但是有的时候我们不想破坏事先的定义,或者不能破坏
  interface Person {
    name?: string
    age?: number
  }
*/

/**
  那这个时候我们就可以用到typescript自带的高级类型 Partial,就相当于将上方接口所有属性变成可选的
  将我们需要定义的类型当做泛型传入Partial中,那么就相当于当前的类型里面的所有属性都是可选的
 */
const person2: Partial<Person> = {} // 可以
const person3: Partial<Person> = { name: 'xiaodu' } // 可以
const person4: Partial<Person> = { height: 1.88 } // 报错 “height”不在类型“Partial<Person>”中

Partial的实现原理

Partial的内部定义

type Partial<T> = {
  [P in keyof T]?: T[P]
}

逐步解析

// 1. keyof T 是什么意思呢?
interface Person {
  name: string
  age: number
}

type PersonKeys = keyof Person // 等同于 type PersonKeys = 'name' | 'age'

const p1: PersonKeys = 'name' // 可以
const p2: PersonKeys = 'age' // 可以
const p3: PersonKeys = 'height' // 不能将类型“"height"”分配给“name | age”
  1. keyof 就是将一个类型的属性名全部提取出来当做联合类型

  2. p in xx 又是什么意思呢?
    in的意思就是遍历,如上就是将 age和name进行遍历

  3. [P in keyof T]? 的冒号就代表 可选 的参数

  4. T[P] 就代表 如 Person[name]代表的是 string 类型

Pick (意思是选择)ts中可以选择一个原来的接口中一部分的属性定义
在这里插入图片描述
如果想要选择多个属性定义呢?
在这里插入图片描述

pick的实现原理

type Pick<T, K extends keyof T> = {
  [P in K]: T[P]
}

pick接收两个泛型

  • 第一个泛型 T 便是 interface 或者 type 定义
  • 第二个就是第一个定义中的属性, extends就代表继承
    K extends keyof T 等同于 k extends ‘name’ | ‘age’,意思就是k只能是age或者name

Exclude (意思是排除) ts中可以排除 联合类型 中一部分的内容

注意Exclude是操作联合类型的,下方将讲到的Omit是操作键值对的
在这里插入图片描述

Exclude的原理

type Exclude<T, U> = T extends U ? never : T

传入两个泛型

  • 我们这里用 MyTypes 也就是 ‘name’ | ‘age’ | ‘height’ 去代表 T
  • 用 name 属性去代表第二个泛型 U
  • T extends U 就判断是否’name’ | ‘age’ | ‘height’ 有 name, 有name就返回never,就代表将其排除

Omit (意思是省略的)ts中就是将接口或者类型的键值对删除一部分
在这里插入图片描述
在这里插入图片描述

Omit原理

也就是上面所讲解的知识点拼凑起来的

type Omit<T, K extends string | number | symbol> = {
  [P in Exclude<keyof T, K>]: T[P]
}
版权声明:本文为dajuna原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/dajuna/article/details/117958613

智能推荐

TypeScript的类型推论与联合类型--(TypeScript 03)

什么是TS中的类型推断? 以下面的例子为例,有时候我们并没有进行类型注解,TS经过推断后给我们添加的类型注解。 什么时候需要进行类型注解什么时候不需要呢? 比如下面的代码,TS能够推断的,我们可以不进行注解 比如下面的代码,TS不能够对参数进行推断的情况下,我们需要进行注解 什么是联合类型? 联合类型指的是一个变量可能具有多种类型,下面我们看一个简单的例子就明白了。 联合类型调用共有属性可以,但是...

11.TypeScript中的联合类型

联合类型(Union Types) 联合类型与交叉类型很有关联,但是使用上却完全不同。 偶尔你会遇到这种情况,一个代码库希望传入 number或 string类型的参数。 例如下面的函数: padLeft存在一个问题, padding参数的类型指定成了 any。 这就是说我们可以传入一个既不是 number也不是 string类型的参数,但是TypeScript却不报错。 在传统的面向对象语言里,...

TypeScript 联合类型

所谓的联合类型就是通过管道 | 来讲变量设置成多种类型,赋值的时候根据设置的类型来进行相应的赋值 注意:只能赋值已经设置好的类型,如果赋值其他类型就会报错。 语法格式如下: Type1|Type2|Type3 实例一: 实例二: 实例三 : 联合类型数组...

Typescript - 联合类型

原文:TypeScript基本知识点整理   零、序言   联合类型表示一个变量值可以是几种类型之一,我们可以使用 “|” 来分割每个类型;   联合类型的变量在被赋值时,会根据类型推断的规则推断出一个类型;   如果一个值是联合类型,我们只能访问联合类型的所有类型中共有的属性/方法;   一、访问联合类型的属性或者方法   当 TypeScript 不...

猜你喜欢

TypeScript联合类型展示

TypeScript联合类型展示 所谓联合类型,可以认为一个变量可能有两种或两种以上的类型。用代码举个例子,声明两个接口Waiter(服务员)接口和Teacher(技师)接口,然后在写一个judgeWho(判断是谁)的方法,里边传入一个animal(任意值),这时候可以能是Waiter,也可能是Teacher。所以我们使用了联合类型,关键符号是|(竖线)。 通过这个简单的例子,你应该知道什么是联合...

typescript联合类型

typescript联合类型:可以通过管道(|)将变量设置成多种类型,赋值时可以根据类型来复制 (说白了可以是多个类型,很好理解) 声明联合类型: 联合类型作为函数参数来使用: 联合类型的数组...

TypeScript 基础 — 联合类型

当一个值可以是多个类型时,使用联合类型。 例如,当一个属性是 string 或 number 时。 联合(| ,OR) 使用 | 表示参数是 string 或 number 类型: 我们可以在任何可以使用其他类型的情况下使用联合类型。例如,使用类型别名: interface 类似,例如: 联合类型错误 在使用联合类型以避免类型错误时,您需要知道自己的类型: 在我们的示例中,调用 toUpperCa...

TypeScript联合类型

联合类型 联合类型表示可以为多中类型中的一种 当我们需要一个变量同时具备多个类型时,这时候就可以使用联合类型声明 联合类型使用 | 分隔每个类型,只能赋值为声明的类型,不然就会报错例如: 访问联合类型属性和方法 当不确定一个联合类型的变量是不哪个类型时,只能访问此联合类型共有的属性和方法...

【稳妥的TypeScript】联合类型、交叉类型和类型保护

大家好,我是一碗周,一个不想被喝(内卷)的前端。如果写的文章有幸可以得到你的青睐,万分有幸~ 联合类型 所谓的联合类型就是定义一些类型,定义的变量只需要满足任意一种类型即可,联合类型使用|定义,示例代码如下: 在上面的代码中我们定义了一个value变量,该变量可以是number、boolean或者string类型。 交叉类型 介绍了联合类型,然后介绍一下与之特别相似的交叉类型。 所谓的交叉类型就是...