TS 笔记(一)

120 阅读3分钟

any类型

  • any类型表示没有任何限制,设置为any类型的变量可以赋予任何类型的值
let x:any
x = 123
x = '123'

实际上当一个变量被设置为any类型 TS会自动的关闭对这个变量的语法检查,即使有类型错误也不报错。

  • 使用场景
    • 为了适配js老项目,因为全都是any类型就相当于写js代码,对老项目进行更新的时候可以防止因为类型错误而报错
    • 处于特殊原因需要关闭语法检查
  • 类型推断

当我们没有显示的指明类型时,TS就会自己去推断它的类型,如果无法推断出类型,就会认为该类型为any类型

function A (a,b){
    return a + b
}
const x = A(1,2)
//A为any类型 这种写法显然是很糟糕的

TypeScript 提供了一个编译选项noImplicitAny,打开该选项,只要推断出any类型就会报错。

注意:即使配置了上面的配置,使用letvar声明的变量推导出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唯一一个。