any类型
any类型就是任何类型都可以,当一个变量为any时,实际上就关闭了对这个变量的类型检测。赋值什么都不会报错
let a:any;
a=5;
a='hello';
工作中应该避免出现any,一般情况下我们会严格执行此规定,当出现any时直接在编译期间就报错了。当有的变量实在不知道怎么定义类型或者老的js项目,可以关闭此设置,当出现any时不会报错
...
"noImplicitAny": false,
...
如果某些变量不赋值,ts也可以自动推导出一些变量的类型
function add(a:number,b:number){
reutrn a+b;
}
上边这种情况下可以推导出add函数的返回值类型是number
let a;
var b;
a=5;
a='hello';
let和var定义变量类型时,如果不确定类型默认是any类型,应尽量避免这种情况
let a=5;
let b:any='hello';
a=b;
console.log(a.toFixed(2));
any类型会污染其他类型,把一个any类型可以赋值给其它任意类型,不会报错,导致在运行阶段会报错,上边的代码很显然字符串'hello'没有number的toFixed方法
unknown类型
let a=5;
let b:unknown;
b=10;
console.log(a+b);//报错
a=b;//报错
if(typeof b === "number"){
console.log(a+b);
}
任何类型都可以赋值给unknown类型(除了any和本身),这点和any一样。不同点是:
- unknown类型不能赋值给其它类型
- unknown类型能进行的运算是有限的,
- 只有经过类型缩小后才能使用(确定类型)
never类型
只有一种应用场景,当一个函数永远没有返回值时,比如抛出异常