any类型
any类型表示没有任何限制,设置为any类型的变量可以赋予任何类型的值
let x:any
x = 123
x = '123'
实际上当一个变量被设置为any类型 TS会自动的关闭对这个变量的语法检查,即使有类型错误也不报错。
- 使用场景
-
- 为了适配js老项目,因为全都是
any类型就相当于写js代码,对老项目进行更新的时候可以防止因为类型错误而报错 - 处于特殊原因需要关闭语法检查
- 为了适配js老项目,因为全都是
- 类型推断
当我们没有显示的指明类型时,TS就会自己去推断它的类型,如果无法推断出类型,就会认为该类型为any类型
function A (a,b){
return a + b
}
const x = A(1,2)
//A为any类型 这种写法显然是很糟糕的
TypeScript 提供了一个编译选项noImplicitAny,打开该选项,只要推断出any类型就会报错。
注意:即使配置了上面的配置,使用let和var声明的变量推导出any类型也不会报错,所以建议当我们使用var或者let声明变量时一定要显示的声明类型。const会报错,其本质是JS规定const在声明时必须赋值
- 污染问题
any类型的变量可以赋值给任何类型,这样的话TS是无法检查出类型错误,会一直到运行时才暴露问题
let a:any = 1234
let b:string = '123'
b = a
console.log(b) //不会报错,打印结果为1234
污染其他具有正确类型的变量,把错误留到运行时,这就是不宜使用any类型的另一个主要原因。
- 总结使用any变量会遇到的问题
-
- 大量的使用
any会失去TS的意义 any类型的变量IDE不能更好的根据类型推断可能需要使用的方法,不便于开发- 存在污染问题,影响其他正确类型的变量,问题一直会留到运行时
- 大量的使用
unknown类型
严格版的any类型
- 可以将任何类型分配给
unknown类型
let a:unknown = 123
a = '123'
a = true
//都是正确的
- 不能将
unknown类型的变量分配给其他变量
let a:unknown = 123
let b:number = a //报错 不能将unknown分配给number类型
- 不能直接使用
unknown类型的变量的方法、属性等
let a:unknown = {
x:1,
y:()=>{
console.log(1);
}
}
console.log(a.x); //报错 类型unknown上不存在x属性
let b : unknown = 'hello'
console.log(b); //直接输出是可以的
unknown类型的运算符是有限的,只能进行比较运算(运算符==、===、!=、!==、||、&&、?)、取反运算(运算符!)、typeof运算符和instanceof运算符这几种,其他运算都会报错。
let a:unknown = 1
const b = a+1 //报错 不能将+应用于unknown 和 number之间
console.log(a===1) // true
怎么使用unknown类型的变量呢?
“缩小类型范围” 或者说 用判断语句确定一个更精确的类型
let a:unknown = 'hello' ;
if(typeof a === 'string'){
console.log(a.length); //5
}
never类型
空类型,不能赋予任何值,当时可以将空类型分配给其他任何类型
TypeScript 有两个“顶层类型”(any和unknown),但是“底层类型”只有never唯一一个。