TypeScript入门|青训营笔记4.2

101 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的第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: stringtype: 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';
rangestring;
}| {
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表示,使用在类型推荐命中的结果中