TypeScript从0基础到项目实战:03.类型(联合与交叉,any与unknown等)

93 阅读3分钟

前言

学了第二章我们可能觉得有时候一个变量只能接受一种类型值的值,不太方便,不过学习本章,我们可以使用联合与交叉,any与unknown这些类型来帮你解决需求

联合类型

特别简单,特别好理解,就是我们做if判断的那个 |(或)

可以把“|”类比为 JavaScript 中的逻辑或 “||”,只不过前者表示可能的类型。

//. 联合类型 | 代表或 ,使用方法如下

let numAndStr:number|string=1; //这里numAndStr可以是num也是可以是str

numAndStr='2';

// . 可以搞成固定值的常量形式

let c:1|'2'=1;//这里的声明类型的1和‘2’就是常量,c只能是数字1或者字符串的2

// ! 对于对象类型

let obj:{a:1}|{b:'2'}; //这样子就表示这个对象只能有a:1或b:‘2’

// obj={a:1,c:1} //添加别的报错

// #endregion

交叉类型

在 TypeScript 中,还存在一种类似逻辑与行为的类型——交叉类型(Intersection Type),它可以把多个类型合并成一个类型,合并后的类型将拥有所有成员类型的特性。使用“&”操作符来声明交叉类型(并集)。

也很简单,我们直接理解成if判断里的那个&就ok

// #region

//  .交叉类型 & 代表并 ,使用方法也很简单,就是在上面或的基础上变成必须都满足
// .就像if判断里面的或与并
// let a:number&tring; 这种就是永远不会满足的,因为不可能有值又是字符串,又是数字
let obj2:{a:1}&{b:'2'};
obj2={a:1,b:'2'} //必须a,b都有
export{};

// #endregion

从上面的代码我们可以看出,&代表必须满足,那么假如我们给他一个自相矛盾的值,让他变成永假式,这是不是一个bug?我们是不是发现了ts的漏洞?哈哈哈我们真是天才

// 思考这里有一个值满足m的类型要求吗?
let m : string & number;

但其实像这种自相矛盾的不可能满足的类型,ts是给了专门的类型的,它就是never

never类型

人如其名,它代表的就是永远不会发生的值的类型

 function throwErrFn():never {
     throw new Error('出错了');
 }

注意:

  1. 如果函数里是死循环,返回值类型也是never

  2. never 是所有类型的子类型

any与unknown

  • any 指的是一个任意类型,它是官方提供的一个选择性绕过静态类型检测的作弊方式。非常不建议使用;Any is Hell
  • unknown 是 TypeScript 3.0 中添加的一个类型,它主要用来描述类型并不确定的变量。和any的区别就是会进行类型检测。
 let unk: unknown;
 let x = 1;
 let y = "2";
 if (x) {
     unk = x;
 } else {
     unk = y;
 }
 
 // 使用unknown后,typescript会做类型检测
 unk.toFixed(2); // 报错 
 // any会绕过类型检测,所以下面不会有问题提示
 let an1: any;
 an1.toFixed(2);
 
 // 通过缩小类型可以通过类型检测
 if (typeof unk === 'number') {
     unk.toFixed(2);
 }

注意:

  1. 可以把任何类型的值赋值给unknown,但是unknown类型的值只能赋值给any或者unknown;
  2. unknown比any好的地方,还有一个就是它可以通过缩小类型的手段类确定类型

end

如果你想接着学习后面的内容可以给这个专栏点个关注,TypeScript从0基础到项目实战我的每一篇文章都会发在这个专栏里,如果觉得对你帮助可以点赞收藏,关注作者