这是我参与「第四届青训营 」笔记创作活动的第18天
一、本堂课的重点内容
二、知识点介绍
上半部分笔记地址:(TypeScript入门|青训营笔记4.1 - 掘金 (juejin.cn))
3.高级类型
3.1 联合/交叉类型
当我们为书籍列表编写类型时,可以这样写:
const bookList = [{
author: 'xiaoming',
type: 'history',
range: '2001-2021',
},{
author: 'xiaoli',
type: 'story',
theme: 'love',}]
这个时候我们可以发现:类型声明繁琐,存在较多的重复。
interface IHistoryBook {
author: string;
type: string;
range: string
}
interface iStoryBook {
author: string;
type: string;
theme: string;
}
type IBookList = Array<IHistoryBook | IStoryBook>;
联合类型:|A | |B;联合类型表示一个值可以是几种类型之一。
交叉类型:|A&|B;多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性。
根据两者的概念,我们可以试着编写一下书籍的类型
type IBookList = Array<{
author: string;}&({
type: 'history';
range: string;
}| {
type:"'story';
theme: string;
})>
3.2类型保护和类型守卫
类型守卫:定义一个函数,它的返回值是一个类型谓词,生效范围为子作用域。
类型保护是可执行运行时检查的一种表达式,用于确保该类型在一定的范围内。 目前主要有四种的方式来实现类型保护:
- in关键字(例如: if ("privileges" in emp) {···})
- typeof关键字(例如: if (typeof padding === "number") {···})
- instanceof 关键字(例如:if(date instanceof Date){···})
- 字面量相等判断 ==, !=, ===, !==
实例
我们来试着写几个例子:
1、函数接受书本类型,并logger出相关特征
function logBook(book:IBookItem) {
// 联合类型 +类型保护 =自动类型推断
if (book.type ==='history') {
console. log( book. range)
} else {
console. log( book. theme);
}
2、实现merge函数类型 ,要求sourceObj必须为targetObj的子集
function mergel(sourceObj, targetObj) {
const result ={ ...sourceObj}; for(let key in targetObj) {
const itemVal = sourceObj[key];
itemVal &&( result[ key] = itemVal );
return result;
function merge2(sourceObj, targetObj) {
return {.... sourceObj, ...targetObj };
3、此时类型实现繁琐:若obj类型较为复杂,则声明source和target便需要大量重复2遍·容易出错:若target增加/减少key,则需要source联动去除
x?: string;
y?:string;
}
interface ITargetObj {
x:string;
y:string;
}
type IMerge =(sourceObj: ISourceObj,targetObj: ITargetObj)=>ITargetObj;
这个时候我们可以做一些修改:
<T extends Record<string, any>>( sourceObj: Partial<T>, targetObj: T); T;}
type IPartial<T extends Record<string, any>> = {
[Pin keyof T]?: T[P];
}
type IKeys =keyof { a: string; b: number ); // => type IKeys ="a" | "b”
索引类型:关键字【keyof】,其相当于取值对象中的所有key组成的字符串字面量
关键字【in】,其相当于取值 字符串字面量中的一种可能,配合泛型P,即表示每个key
关键字【?】,通过设定对象可选选项,如可自动推导出子集类型
三、课后总结
这节课还需要多练习,还要注意容易遗忘的点:
关键字【extends】跟随泛型出现时,表示类型推断,其表达可类比三元表达式//如T===判断类型?类型A:类型B
关键字【infer】出现在类型推荐中,表示定义类型变量,可以用于指代类型
如 该场景下,将函数的返回值类型作为变量,使用新泛型R表示,使用在类型推荐命中的结果中