TypeScript泛型工具
Required
将类型的属性变成必选
interface Person {name?: stringage?: numberhobby?: string[]
}// 下面的类型不用定义, TypeScript自带
type Required<T> = {// -? 非常有意思, 相当于把可选的去掉[key in keyof T]-?: T[Key]
}
// Required 包裹之后 Person的所有属性变为必选了
const user1: Required<Person> = {name: "Ervin Howell",age: 26,hobby: ['code', '...']
}
Partial
Partial与Required相反, 将所有属性变为可选
interface Person {name: stringage: numberhobby: string[]
}// 下面的类型不用定义, TypeScript自带
type Partial<I> = {[k in keyof T]?: T[K]
}// Partial 包裹之后 Person的所有属性变为可选了
const user1: Partial<Person> = {name: "Ervin Howell",age: 26,
}
Exclude
Exclude<T, U> 的作用是将某个类型中属于另一个的类型移除掉, 剩余部分构成新的类型
去除UnitTypeShort类型中的 ‘D’, ‘M’
// 下面的类型不用定义, TypeScript自带
type Exclude<T, U> = T extends U? never : Ttype UnitTypeShort = 'd' | 'D' | 'M' | 'y' | 'h' | 'm' | 's' | 'ms'const foo: Exclude<UnitTypeShort, 'D' | 'M'> = 'd'
const bar1: Exclude<UnitTypeShort, 'D' | 'M'> = 'D'
// 类型“"D"”不可分配给类型“"d" | "y" | "h" | "m" | "s" | "ms"”。你的意思是“"d"”?ts(2820)
const bar2: Exclude<UnitTypeShort, 'D' | 'M'> = 'M'
// 类型“"M"”不可分配给类型“"d" | "y" | "h" | "m" | "s" | "ms"”。你的意思是“"m"”?ts(2820)
Extract
和 Exclude<T, U> 相反, Extract<T, U> 从T中提取出U, 适用于并集类型
从T中提取出U
// 下面的类型不用定义, TypeScript自带
type Extract<T, U> = T extends U ? T : never;const foo: Extract<'a' | 'b' | 'c', 'a' | 'b' | 'd'> = 'd'**加粗样式**
'a' | 'b' | 'c' extends 'a' | 'b' | 'd'? T :never
step1:('a' extends 'a' | 'b' | 'd'?'a':never) => 'a'
step2:('b' extends 'a' | 'b' | 'd'?'b':never) => 'b'
step3: ('c' extends 'a' | 'b' | 'd' ? 'c' : never) => never
res: 'a' | 'b' | never=>'a' | 'b'
泛型+extends 泛型传的是联合类型 先拆解判断再组装成联合类型
Readonly
数组或对象的所有属性值转换为只读, 这些属性不能被重新赋值
// 下面的类型不用定义, TypeScript自带
type Readonly<T> = {readonly [P in keyof T]: T[P];
}interface Person {name: stringage: numberhobby: string[]
}const user: Readonly<Person> = {name: 'Ervin Howell',age: 26,hobby: ['code', '...']
}
user.age = 25
// 无法为“age”赋值,因为它是只读属性。ts(2540)
Record
Record<K extends keyof any, T>的作用是将K中的所有属性的值转换为T类型
// 下面的类型不用定义, TypeScript自带
type Record<K extends keyof any, T> = {[P in K]: T;
};interface Person {name: stringage: numberhobby: string[]
}
const correct: Record<Pe, string> = {name: 'Ervin Howell',age: '26岁'
}const error: Record<Pe, string> = {name: 'Ervin Howell',age: 26
}// 不能将类型“number”分配给类型“string”。ts(2322)
Pick
从某个类型中挑出一些属性出来
// 下面的类型不用定义, TypeScript自带
type Pick<T, K extends keyof T> = {[P in K]: T[P];
};interface Person {name: stringage: numberhobby: string[]
}
const foo: Pick<Person, 'name' | 'age'> = {name: 'Ervin Howell',age: 26
}
Omit
从某个类型中取出出去K的其他所有属性(与Pick相反)
// 下面的类型不用定义, TypeScript自带
type Omit<T, K extends keyof any> = Pick<T, Exclude<keyof T, K>>;interface Person {name: stringage: numberhobby: string[]
}
// 取出 除去 'age'和'hobby'之外的属性
const foo: Omit<Person, 'age' | 'hobby'> = {name: 'Ervin Howell'
}
NonNullable
去除类型中的null和undefined
// 下面的类型不用定义, TypeScript自带
type NonNullable<T> = T & {};type p1 = NonNullable<string | null | undefined>
// type p1 = string
type p2 = NonNullable<string[] | number | undefined>
// type p2 = number | string[]
type p3 = NonNullable<string[] | number[] | { name: string } | undefined>
// type p3 = string[] | { name: string; } | number[]
ReturnType
用来得到一个函数的返回值类型
// 下面的类型不用定义, TypeScript自带
type ReturnType<T extends (...args: any) => any> = T extends (...args: any) => infer R ? R : anytype Fun2 = (value: string) => stringtype off = ReturnType<Fun2>
// type off = string
Parameters
用于获得函数的参数类型所组成的元组类型
// 下面的类型不用定义, TypeScript自带
type Parameters<T extends (...args: any) => any> = T extends (...args: infer P) => any ? P : never;type p1 = Parameters<(a: number, b: string) => string>
// type p1 = [a: number, b: string]
TypeScript泛型工具相关推荐
- 【TS】1368- 秒懂 TypeScript 泛型工具类型!
阿宝哥精心准备的<轻松学 TypeScript> 视频教程已经更新到第十九期了,合集播放量已达 14W+.通过形象生动的动画,让你轻松搞懂 TypeScript 的难点和核心知识点! 如果 ...
- 泛型 typescript_如何把你的头围绕Typescript泛型
泛型 typescript by Nadeesha Cabral 通过Nadeesha Cabral 如何把你的头围绕Typescript泛型 (How to wrap your head aroun ...
- TypeScript 实用工具类型之 Pick 类型
TypeScript 实用工具类型之 Pick 类型 TypeScript 实用工具类型之 Pick 类型 1. 什么是对象类型转换? 2. 什么是 TypeScript Pick? 2.1 用 Pi ...
- TypeScript - 泛型
前言 本文主要记录下 TypeScript 泛型知识点,日常学习总结篇. 一.概念 泛型(Generics)是指在定义函数.接口或类的时候,不预先指定具体的类型,而在使用的时候再指定类型的一种特性. ...
- java8:封装lambda泛型工具类之list转为map
1 史上最简单入门:java8的lambda中的map相关操作:基础及注意事项图文详解 2 java8的lambda中collect接口案例及原理详解,官方文档解读 3 java8:封装l ...
- TypeScript 实用工具类型之 Partial 类型
TypeScript 实用工具类型之 Partial 类型 TypeScript 实用工具类型之 Partial 类型 1. 场景概述 2. Partial<Type> 3. 使用 Int ...
- typescript (TS)进阶篇 --- 内置高阶泛型工具类型(Utility Type)
第一部分 前置内容 关键字 keyof 索引查询 对应任何类型T,keyof T的结果为该类型上所有公有属性key的联合: interface Eg1 {name: string,readonly a ...
- 【前端进阶】-TypeScript高级类型 | 泛型约束、泛型接口、泛型工具类型
前言 博主主页
- docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档
为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...
最新文章
- Access sql语句创建表及字段类型
- Sublime Text 3 快捷键精华版
- Java ConcurrentHashMap Example and Iterator--转
- 多进程与多线程(1)
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(四十九) 落雷!治疗!陷阱!连锁闪电!多段群伤!魔法之终极五重奏②...
- tbytes 转 十六进制 string
- MySQL的存储函数与存储过程的区别
- 太实用了!这几个Python数据可视化案例!
- php 公交查询,php公交车线路查询系统
- 他是学计算机的这个句子中宾语是动词性的,《现代汉语语法修辞》 综合试卷有全部答案...
- 续写故事demo php,续写故事——惊喜温情
- Cadence 原理图操作记录
- android抓取日志,Android抓取所有日志
- mysql user导出权限_mysql快速导出user权限
- IDEA try catch快捷键、 快速生成get set 方法快捷键、快速生成有参和无参构造方法快捷键
- 信号包络及其提取方法(Matlab)
- 如何自己编写字符串处理函数
- 三连击(升级版)题解(洛谷P1618)
- STM32学习笔记——CH340一键下载电路
- 李纳斯是个怎样的人?