1、自动类型
变量没有声明类型,在第一次赋值时会按照值的类型设置变量类型
这会导致编译过程再去判断,影响效率
自动类型必须要在第一次声明的时候就进行赋值,如果只声明,变量会被转化成any类型
/ let names = "haofusheng"; //转化成string类型
// names="dly"; //不报错
// names=23; //报错
// let names1; //转化成any类型
// names1="haofusheng"; //不报错
// names1=23; //不报错
2、字符类型string
字符类型与js规范相同
构造函数写法返回的是对象型,str会报错
// let str:string; //声明变量为字符型
// str="aaa"; //双引号写法
// str='bbb'; //单引号写法
// str=`ccc`; //字符模板写法,可换行
// str=1+"ddd"; //表达式返回值如果是字符型也可以
3、数值类型number
数值类型与js规范相同
// let num:number; //声明为数值型
// num=23; //整数
// num=-23; //负数
// num=23.333; //小数
// num=0x23; //16进制
// num=0o744; //8进制
// num=23e+5; //科学计数法
4、布尔类型 boolean
布尔类型与js规范相同
// let bool:boolean; //声明为布尔型
// bool=false; //直接赋值true/false
// bool=!0; //非来转化
// bool=3>4; //通过关系运算符来比较
// bool=isNaN(Number("2222")); //一些方法返回值也是布尔类型
5、null与undefined
null与undefined一般不会直接赋值给变量,他一般会通过联合类型与其他类型连用
// let obj:object | null;
// obj={a:1}; //定义对象
// obj=null; //添加清理标记
// let ids:number|undefined;
// ids=setTimeout(() => { //定时器标记
// clearTimeout(ids);
// ids=undefined; //清除定时器标记
// },100);
6、字面量
运用我们能看见的定义方式去规定变量类型
他一般会与联合类型一块使用这样做到定义多个类型
可以用在一些限制值的地方
// let a1:10; // a1的值只能是10
// let a2:"男" | "女"; //与联合类型一起使用
// let a3:10 | "aa" | true | null | undefined; //不同类型值也可以共存
7、联合类型 |
let b1:"值1" | "值2";
8、任意类型 any
any类型可以赋值任何类型,也可以赋值给任意类型,never类型除外
它相当于关闭了TS的类型检查
声明的变量如果不声明类型,就会默认为any类型
// let c1:any;
// let c2; //没有声明类型,默认也是any类型,但是不加编译会多一层判断
// c1=true;
// c1=123;
// c1="aaa";
// c1=null;
// c1=3;
// let c3:string; //声明c3是字符型
// c3=c1; //c1为数字,但是因为他是any类型,可以直接赋给非数值型
9、未知类型 unknown
unknown 在赋值时可以为任何类型,这一点与any一样
unknown 不可以赋值给任何类型
unknown 是一个只能影响自身的any类型,他不会影响其他的变量
unknown 可以赋值给any类型
// let d1:any;
// let d2:unknown="hellow";
// d2=23; // 自身可以赋值任何类型
// d2=null;
// d1=d2; //可以赋值给any类型
10、空 void
void类型值可以为空、null、undefined
它常用在函数没有返回值的地方
声明函数void类型的情况:返回null、undefined、什么不返回、return后什么不写
// function fn():void{ //当函数没有返回值或者返回值为null、undefined可以使用
// return;
// }
// function fn1():void{
// }
11、没有返回值 never
never永远不会存在的类型、永远不会结束
它规定一个不会有的值
如果返回的是一个null或者undefined也算是值,也会报错
一个条件永远不会进入的时候里面的变量也是never
他唯一的返回值就是报错
never不可以赋值给任何类型,但是他不能被任何类型赋值,包括any
它可以用在死循环,如果这个死循环
可以用在分支语句,如果没有处理某个分支语句进入默认语句,在默认语句赋值never类型,最后报错
// function fn():never{ //这个函数永远不会执行完
// while (true) {}
// }
// function fn2():never { //这个函数返回一个错误
// throw new Error("这是一个错误");
// }
// type fnType = "aa" | "bb"; //参数的可选类型
// function fn3(value:fnType){ //函数执行传入参数限制为fnType中可选项
// switch (value) { //传入参数处理,我们的理想是对每个参数都有相应的处理方法
// case "aa":
// break;
// case "bb":
// break;
// default: //有不能处理的参数时进入default,从而报错,提醒添加处理分支
// const improve:never=value;
// break;
// }
// }
有可能在添加fnType类型后,并没有在这里添加相应的处理分支,这时候就会进入default,由于never不能赋值任何类型,所以将参数赋值给never类型会报错