- TS基本类型




- 字面量:**直接使用字面量进行类型声明**
字面量:限制变量的值就是该字面量的值,字面量还可以用联合类型表示
*联合类型:把两个或多个类型连成一个类型(可以使用 | 来连接多个类型)
//此时a报错
// | 是或
//最后一行b报错
[x] any类型
*any表示的是任意类型,可以任意赋值,一个变量设置类型为any后相当于对该变量关闭了TS的类型检测<br /> *使用TS时,不建议使用any类型,和js没啥区别<br /> *声明变量如果不指定类型,则TS解析器会自动判断变量的类型为any(隐式的any)<br />//显式any//隐式any
[x] unknown类型
*但在开发过程中,并不是每个变量都能确定类型,此时建议用unknown类型,<br /> *unknown表示未知类型的值<br /> *以下是unknown和any的区别:<br /> +any:给其他变量赋值,其他变量会关闭类型检查<br /> +unknown:虽然可以给自己随意赋值任意类型,但是给其他变量赋值,会报错<br /> //d的类型是any,可以赋值给任意变量,所以赋值给s,不会报错,此时s的类型变成any,类型检查也被关了<br /> //报错,因为此时e虽然被赋值'hello',但是e的类型看的是unknown,是未知的。而s的类型是字符串,无法将e(未知类型)赋值给s(字符串类型),因此会报错。<br /> *unknown实际上就是一个类型安全的any<br /> *unknown类型的变量,不能直接赋值给其他变量<br />如果我就是想把变量e(unknown类型)赋值给变量s(字符串类型),那么赋值之前必须先做类型检查<br /><br /> *或者使用TS的**类型断言**:判断的语言,告诉解析器变量的实际类型<br />(有些时候变量,ts的编译器不知道,但我自己知道类型。所以我们要告诉编译器这些变量是什么类型)<br />( *有些情况下,变量的类型对于我们来说是很明确的,但是ts编译器却并不清楚,此时,可以通过类型断言来告诉编译器变量的类型,断言有两种形式:)<br /> +类型断言的两种写法:<br /><br /> *当遇到类型不确定的变量的时候,能用unknown就不用any
[x] void类型、never类型
*这两个类型在变量的时候用得不多,主要用来设置函数的返回值<br /> <br /> *当函数有/没有返回值:<br /> +当没有设置函数返回值类型的时候,函数返回值类型的自动判断都一定是any类型;<br /> +当函数有返回值的时候,函数会自动判断具体返回值的类型;<br /><br /> +如果函数里没有写return,函数的类型自动判断为void<br /><br /> +以下截图证明ts编译器:可以根据返回值情况来判断返回值类型<br /><br /> *ts可以指定返回值类型:但当函数没有返回值的时候<br /> (例如alert函数,console.log函数这种没有返回值类型的函数),<br /> 可以指定函数返回值类型为void,表示空,以函数为例,就表示没有返回值的函数<br />//因为指定了void,此时只要有return 一个值就报错了<br /> //但是如果写: return;或者 return undefined;或者return null就不会报错,<br /> //在ts 中这些表示返回值为空
此时,ts中的never类型:表示永远没有值,永远不会返回结果,连空都没有返回,


在js中,有一种函数不返回结果,连undefined都不返回,这种函数是用来报错的(throw )
因为函数一旦报错,代码就会立即结束了,都结束了肯定就没有返回值了,这种函数返回值类型就可以设置为never
[x] Object类型
*object表示一个js对象,但实际上并不是很实用(因为在js中,对象实在太多:函数,{},,对添加没有限制)<br /> *在想限制一个对象的时候,更想限制的是对象当中包含的哪些属性,而不是限制这个变量是不是一个对象<br />//对象a,对象b有什么区别呢??区别如下:对象a用object这样指定没有意义<br /> +而对象b:用{} 可以用来指定对象包含哪些属性:(语法:{属性名:属性值,属性名:属性值……}<br /> =对象b里面可以指定一些属性:let b : {name: string}; //指定对象b包含name 这个属性<br /> -表示变量b指向一个对象,并且这个对象里面得有name这个属性,属性不能多不能少<br /> =如果此时给b赋值一个{ };会报错!<br /> -如左图:因为{ }里没有name这个属性。如果多写了属性也会报错。<br /> -如右图赋值就不会报错。<br /> =如果给属性名后面加个问号?,就表示这个属性可选的,有也可以没有也可以<br /> - let b :{name:string,age?:number};<br /> =如果只要求对象必须有name属性,对于其他很多属性都不做要求,可有可无:<br /> - 因为其他可有可无的属性太多,所以写问号很麻烦<br /> -此时可以用 [propName:string]:any //表示任意类型的属性<br /> (propName表示属性名(可以换其他字母);<br /> string表示propName这个属性名的类型是字符串;属性名是字符串,不是属性是字符串<br /> any表示其他属性是任意类型,如果换成string,表示其他属性必须是string类型<br /><br /> +设置函数结构的类型声明:(用类似箭头可以用来限制对象的函数结构)有几个参数,返回值是什么类型<br /> 语法:(形参:类型,形参:类型,……)=> 返回值类型;<br />  <br /> =左图这样指定对象为函数类型没有啥意义,右边可以限制对象的函数结构<br /> =右图这种语法:类似类型声明:希望d这个函数有两个都是number类型的参数,并且返回值为number类型<br /> <br /> //如果参数个数多了/少了,参数类型变了,函数返回结果类型变了都会报错
[x] Array数组类型
*数组需要区分数组里面存的值,但js里面的数组默认是没有类型概念,js数组里想存什么类型都行(这样在开发中存储性能并不是很好)<br /> *数组的类型声明(两种语法):1.let a : 类型[ ]; 2.let a : Array<类型>;<br /> 一个数组里面值的类型都一样:let arr:string[]; string[]表示字符串数组<br /> //两种写法都可以
[x] tuple类型(元组,js里没有的)
*元组:固定长度的数组(存储效果比数组好,因为长度固定,变化的几率少)<br /> *语法:let h: [string,number];//h这个数组有两个变量(第一个是string,第二个是number,不能多不能少<br /> 出错:
[x] enum类型(枚举,js里没有的)
*在处理数据的时候,经常需要有些数据<br />//在开发的时候一般不会去这么存这些值,存这些值的目的是为了判断这个对象到底是男的还是女的<br />如果判断这个对象是男的还是女的,可以这样判断:<br />但是字符串存到数据库里来说相对比较大,而且gender属性只有三个值:男,女,中。像gender值在一定范围之内的,可以不写男女,用number来代替,这样判断、存储比较方便。但最后呈现这些信息的时候也不方便*语法如下:Enum开头表示定义了给枚举类,这个类名字叫Gender<br /> //左图前面=0的=1是自动补全的不用自己写,但也可以写<br /> 
- 或:|、与:&
两个类型之间可以用 | 连接,表示或
两个类型之间可以用 & 连接,表示且/同时
//没有意义,因为一个变量不可能既是string又是number类型
//代表变量j既要满足前面,又要满足后面,name和age都要有,连接两个对象
[x] 类型别名
*type 自定义的类型名 = 类型内容;可以简化类型的使用<br />
