TS系列教程四:三种特殊类型

77 阅读2分钟

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类型

只有一种应用场景,当一个函数永远没有返回值时,比如抛出异常

总结:any和unknown是ts中两种顶级类型,任何类型都可以被赋值为这两种类型,never是ts中底层类型,任何类型都包含never类型